From a1978571e8b86303b9a1da0d7a912a9810e12cb7 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 5 Oct 2017 13:38:08 +0100 Subject: [PATCH 01/19] First part of Product Guide --- docs/_docs/product-guide-how-talk-works.md | 23 +++++ .../product-guide-plugins-and-recipes.md | 91 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 docs/_docs/product-guide-how-talk-works.md create mode 100644 docs/_docs/product-guide-plugins-and-recipes.md diff --git a/docs/_docs/product-guide-how-talk-works.md b/docs/_docs/product-guide-how-talk-works.md new file mode 100644 index 000000000..09dfbdb74 --- /dev/null +++ b/docs/_docs/product-guide-how-talk-works.md @@ -0,0 +1,23 @@ +--- +title: How Talk Works +permalink: /how-talk-works// +class: product-guide +--- + +Talk is an open-source commenting platform. It has two pieces. One is the embedded script, which allows newsrooms to have a unique comments section on each story/post/page they have on their site, and allows their readers to comment and discuss articles. The other is the Admin, which is where newsrooms moderate their comments and manage and configure Talk. + +### What is Talk Core? + +As we’re building Talk, our vision was always to have it be very modular, so there are features we have built and are opinionated about, but we allow newsrooms and their developers to customize Talk easily so that it fits their use cases and needs. + +Talk Core is the core application of Talk - this contains all of the standard commenting features that are necessary for a comment section, and ones that we believe are important to be universal. + +### What are Plugins? + +Plugins are additional functionality which are optional to use with Talk. You can turn these on or off, depending on your specific needs. Plugins are either part of our core plugins, which ship with Talk, or they are developed by 3rd parties and either used privately and internally, or are open sourced for use across the greater community. + + +### What are Recipes? + +Recipes are plugin templates that are created by the Talk team and 3rd party developers, in order to help contributors and newsrooms build plugins easily. + diff --git a/docs/_docs/product-guide-plugins-and-recipes.md b/docs/_docs/product-guide-plugins-and-recipes.md new file mode 100644 index 000000000..b907eb49f --- /dev/null +++ b/docs/_docs/product-guide-plugins-and-recipes.md @@ -0,0 +1,91 @@ +--- +title: Plugins & Recipes +permalink: /plugins-and-recipes/ +class: product-guide +--- + +### Default Plugins + +The default Talk plugins can be found in the `plugins.default.json` file [here](https://github.com/coralproject/talk/blob/master/plugins.default.json). + +Talk ships out of the box with these plugins: + +#### Auth `talk-plugin-auth` + +Enables generic registration via an email address, a username, a password, and a password confirmation. To sync Talk auth with your own auth systems, you can use this plugin as a template. + +#### Facebook Auth `talk-plugin-facebook-auth` + +Enables sign-in via Facebook. + +#### Comment Content `talk-plugin-comment-content` + +Pluginizes the text of a comment to support custom treatment of this text. By default, we linkify urls so they are clickable. + +#### Respect `talk-plugin-respect` + +Enables a Respect reaction button. Why a “respect” button, you ask? [Read more here](https://mediaengagement.org/research/engagement-buttons/). + +#### Ignore User `talk-plugin-ignore-user` + +Enables ability for users to ignore (or “mute”) other users. If a user is ignored, you will not see any of their comments. You can un-ignore a user via the My Profile tab. + +#### Permalinks `talk-plugin-permalink` + +#### Featured Comments `talk-plugin-featured-comments` + +Enables the ability for Moderators to feature and un-feature comments via the Stream and the Admin. Featured comments show in a first-place tab on the Stream if there are any featured comments on that story. + +#### Viewing Options `talk-plugin-viewing-options` + +##### Sorting Options `talk-plugin-sort-newest`, `talk-plugin-sort-oldest`, `talk-plugin-most-respected`, `talk-plugin-most-replied` + +##### Off-topic `talk-plugin-offtopic` + +#### Author Menu `talk-plugin-author-menu` + +##### Member Since `talk-plugin-member-since` + +#### In-Stream Moderation `talk-plugin-moderation-actions` + +Enables in-stream moderation so that Moderators can reject, approve, and feature comments, as well as ban users, directly from the comment stream. + +#### Moderation Flag Details `talk-plugin-flag-details` + +Enables other plugins to use the Flag Details area of comments in the Moderation Queues to display data. + + +### Additional Plugins + +#### Like `talk-plugin-like` + +Provides a `like` reaction button. Can also be added to the Viewing Options sorts by including `talk-plugin-most-liked`. + +#### Love `talk-plugin-love` + +Provides a `love` reaction button. Can also be added to the Viewing Options sorts by including `talk-plugin-most-loved`. + +#### Remember Sort `talk-plugin-remember-sort` + +Enables saving a user’s last sort selection as they browse other articles. + +#### Deep Reply Count `talk-plugin-deep-reply-count` + +Enables counting of comments to include replies. Requires dev work to enable this fully. + +### Recipes + +Recipes are available here: +https://github.com/coralproject/talk-recipes + +#### Avatars `recipe-avatar` + +Provides support for commenter avatars. + +#### Subscriber Badge `recipe-subscriber` + +Provides support for badges for `subscribers`. + +#### Author Name `recipe-author-name` + +Enables the ability to hover over a commenter’s name and add plugin functionality there. The Member Since plugin is an example of this. From 71de5a33a95f6192b440f7c030b20c5470313043 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 5 Oct 2017 13:40:53 +0100 Subject: [PATCH 02/19] Update nav --- docs/_data/nav.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/_data/nav.yaml b/docs/_data/nav.yaml index 51b44f025..2a6f5b5e1 100644 --- a/docs/_data/nav.yaml +++ b/docs/_data/nav.yaml @@ -16,4 +16,10 @@ items: - title: Plugins children: - title: Plugins Overview - url: /plugins/ \ No newline at end of file + url: /plugins/ + - title: Product Guide + children: + - title: How Talk Works + url: /how-talk-works/ + - title: Plugin and Recipe List + url: /plugins-and-recipes/ From 6ffab51bcf0ceeb46c6b217971c09e8899c2aa4a Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 5 Oct 2017 13:41:54 +0100 Subject: [PATCH 03/19] Cleanup titles --- docs/_docs/product-guide-plugins-and-recipes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/product-guide-plugins-and-recipes.md b/docs/_docs/product-guide-plugins-and-recipes.md index b907eb49f..aed661adb 100644 --- a/docs/_docs/product-guide-plugins-and-recipes.md +++ b/docs/_docs/product-guide-plugins-and-recipes.md @@ -1,5 +1,5 @@ --- -title: Plugins & Recipes +title: Plugin and Recipe List permalink: /plugins-and-recipes/ class: product-guide --- From 34178919dc5d73bcac899cd9df2f365d69eaf508 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 11 Oct 2017 15:16:21 +0700 Subject: [PATCH 04/19] Count leading and trailing whitespace towards char count --- client/talk-plugin-commentbox/CommentForm.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/talk-plugin-commentbox/CommentForm.js b/client/talk-plugin-commentbox/CommentForm.js index 55d248994..7c9f1342f 100644 --- a/client/talk-plugin-commentbox/CommentForm.js +++ b/client/talk-plugin-commentbox/CommentForm.js @@ -85,9 +85,14 @@ export class CommentForm extends React.Component { render() { const {maxCharCount, submitEnabled, cancelButtonClassName, submitButtonClassName, charCountEnable, body, loadingState} = this.props; - const length = body.trim().length; - const isRespectingMaxCount = (length) => charCountEnable && maxCharCount && length > maxCharCount; - const disableSubmitButton = !length || isRespectingMaxCount(length) || !submitEnabled({body}) || loadingState === 'loading'; + const length = body.length; + const isRespectingMaxCount = (length) => charCountEnable && maxCharCount && length > maxCharCount; + const disableSubmitButton = + !length || + body.trim().length === 0 || + isRespectingMaxCount(length) || + !submitEnabled({body}) || + loadingState === 'loading'; const disableCancelButton = loadingState === 'loading'; const disableTextArea = loadingState === 'loading'; From b827abffbbbdcb0dcd930fcb67dd08b308880b77 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 10:32:35 +0100 Subject: [PATCH 05/19] Update Readme --- README.md | 6 ++++++ public/img/browserstack_logo.png | Bin 0 -> 24945 bytes 2 files changed, 6 insertions(+) create mode 100644 public/img/browserstack_logo.png diff --git a/README.md b/README.md index 057b29cf1..fc707b6c9 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ Check out our Docs: https://coralproject.github.io/talk/ - Project: https://coralproject.net/ - Roadmap: https://www.pivotaltracker.com/n/projects/1863625 +## Testing + +Talk uses Nightwatch as our end-to-end and cross-browser testing framework provided with love by our friends at Browserstack. + +![](/public/img/browserstack_logo.png) + ## License Copyright 2017 Mozilla Foundation diff --git a/public/img/browserstack_logo.png b/public/img/browserstack_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..59497557b11ae5b7810e4c561c471e10813daed0 GIT binary patch literal 24945 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 ZpjXIh)Esy#3Oq^y4XU6nUnOf6^gj$a1hN1C literal 0 HcmV?d00001 From 674d7837f6e7611b769a280c2b5027c51dfffbd4 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 10:38:23 +0100 Subject: [PATCH 06/19] Change logo size --- public/img/browserstack_logo.png | Bin 24945 -> 6376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/img/browserstack_logo.png b/public/img/browserstack_logo.png index 59497557b11ae5b7810e4c561c471e10813daed0..c46798eb220e00a2892d5833c145a982bc373585 100644 GIT binary patch literal 6376 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 ZpjXIh)Esy#3Oq^y4XU6nUnOf6^gj$a1hN1C From 341e8d9af6599a1a9f1189fe211b82cfe89e8910 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 10:40:28 +0100 Subject: [PATCH 07/19] Cleanup license text --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fc707b6c9..6ee5852ce 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,12 @@ Talk uses Nightwatch as our end-to-end and cross-browser testing framework provi you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + either express or implied. - See the License for the specific language governing permissions and limitations under the License. + See the License for the specific language governing permissions + and limitations under the License. From 8e9e61a610a17cc41a1a701054cc7c795391080d Mon Sep 17 00:00:00 2001 From: Kiwi Date: Wed, 11 Oct 2017 12:05:25 +0200 Subject: [PATCH 08/19] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ee5852ce..ea13d2fac 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,10 @@ Check out our Docs: https://coralproject.github.io/talk/ - Project: https://coralproject.net/ - Roadmap: https://www.pivotaltracker.com/n/projects/1863625 -## Testing +## End-to-End Testing + +Talk uses [Nightwatch](http://nightwatchjs.org/) to write e2e tests. The Testing infrastructure is provided with love by our friends at Browserstack that allows us to run our tests in real browsers. -Talk uses Nightwatch as our end-to-end and cross-browser testing framework provided with love by our friends at Browserstack. ![](/public/img/browserstack_logo.png) From b46ad5448c80f72b3de83211b45f57c6d29929d2 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 11:08:19 +0100 Subject: [PATCH 09/19] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea13d2fac..ad20faf03 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Check out our Docs: https://coralproject.github.io/talk/ ## End-to-End Testing -Talk uses [Nightwatch](http://nightwatchjs.org/) to write e2e tests. The Testing infrastructure is provided with love by our friends at Browserstack that allows us to run our tests in real browsers. +Talk uses [Nightwatch](http://nightwatchjs.org/) to write e2e tests. The testing infrastructure that allows us to run our tests in real browsers is provided with love by our friends at Browserstack. ![](/public/img/browserstack_logo.png) From a7d87f4ee1a2f10492cd5f231c0498aa85eeb473 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 13:34:15 +0100 Subject: [PATCH 10/19] Add Trust Product Docs --- docs/_docs/product-guide-how-talk-works.md | 2 +- docs/_docs/product-guide-trust.md | 26 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 docs/_docs/product-guide-trust.md diff --git a/docs/_docs/product-guide-how-talk-works.md b/docs/_docs/product-guide-how-talk-works.md index 09dfbdb74..1fc70eecc 100644 --- a/docs/_docs/product-guide-how-talk-works.md +++ b/docs/_docs/product-guide-how-talk-works.md @@ -1,6 +1,6 @@ --- title: How Talk Works -permalink: /how-talk-works// +permalink: /how-talk-works/ class: product-guide --- diff --git a/docs/_docs/product-guide-trust.md b/docs/_docs/product-guide-trust.md new file mode 100644 index 000000000..3600031d0 --- /dev/null +++ b/docs/_docs/product-guide-trust.md @@ -0,0 +1,26 @@ +--- +title: Trust +permalink: /trust// +class: product-guide +--- + +“Trust” are components within Talk that incorporate automated moderation features based on a user’s previous behavior. + +### User Karma Score + +Using Trust’s calculations, Talk will automatically pre-moderate comments of users who have a negative karma score. All users start out with a `0` neutral karma score. If they have a comment approved by a moderator, their score increases by 1; if they have a comment rejected by a moderator, it decreases by 1. When a commenter is labeled as Unreliable, their comments must be moderated before they are posted. + +When a commenter has one comment rejected, their next comment must be moderated once in order to post freely again. If they instead get rejected again, then they must have two of their comments approved in order to get added back to the queue. + +Here are the default thresholds: + +-2 and lower: Unreliable +-1 to +2: Neutral ++3 and higher: Reliable + +You can configure your own Trust thresholds by using `TRUST_THRESHOLD` in your configuration. [https://coralproject.github.io/talk/advanced-configuration/#trust_thresholds](Learn more about how to configure Trust here). + + +### Reliable and Unreliable Flaggers + +Details coming soon. From 1dd1a0d986421361305554c41bec2ddf6c190888 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 13:43:48 +0100 Subject: [PATCH 11/19] Update Trust details and update nav --- docs/_data/nav.yaml | 4 +++- docs/_docs/product-guide-trust.md | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/_data/nav.yaml b/docs/_data/nav.yaml index 2a6f5b5e1..b9902965a 100644 --- a/docs/_data/nav.yaml +++ b/docs/_data/nav.yaml @@ -22,4 +22,6 @@ items: - title: How Talk Works url: /how-talk-works/ - title: Plugin and Recipe List - url: /plugins-and-recipes/ + url: /plugins-and-recipes/ + - title: Trust + url: /trust/ diff --git a/docs/_docs/product-guide-trust.md b/docs/_docs/product-guide-trust.md index 3600031d0..dcdc7a5ff 100644 --- a/docs/_docs/product-guide-trust.md +++ b/docs/_docs/product-guide-trust.md @@ -23,4 +23,10 @@ You can configure your own Trust thresholds by using `TRUST_THRESHOLD` in your c ### Reliable and Unreliable Flaggers -Details coming soon. +Trust also calculates how reliable users are in terms of the comments they report. This information is displayed to moderators in the User History drawer, which is accessed by clicking on a user’s name in the Admin. + +If a user's reports mostly match what moderators reject, their Report status will display to moderators as Reliable in the user information drawer. If a user's reports mostly differ from what moderators reject, their Report status will show as Unreliable. + +If we don't have enough reports to make a call, or the reports even out, their status is Neutral. + +Note: Report Karma doesn't include reports of "I don't agree with this comment". From ac281062510de58df4dad14e2fa5fa32861eb7ab Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 11 Oct 2017 13:56:35 +0100 Subject: [PATCH 12/19] Add docs on Toxic Comments --- docs/_data/nav.yaml | 2 + docs/_docs/product-guide-toxic-comments.md | 54 ++++++++++++++++++++++ docs/_docs/product-guide-trust.md | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 docs/_docs/product-guide-toxic-comments.md diff --git a/docs/_data/nav.yaml b/docs/_data/nav.yaml index b9902965a..96f00edaa 100644 --- a/docs/_data/nav.yaml +++ b/docs/_data/nav.yaml @@ -25,3 +25,5 @@ items: url: /plugins-and-recipes/ - title: Trust url: /trust/ + - title: Toxic Comments + url: /toxic-comments/ diff --git a/docs/_docs/product-guide-toxic-comments.md b/docs/_docs/product-guide-toxic-comments.md new file mode 100644 index 000000000..f72066c46 --- /dev/null +++ b/docs/_docs/product-guide-toxic-comments.md @@ -0,0 +1,54 @@ +--- +title: Toxic Comments +permalink: /toxic-comments/ +class: product-guide +--- + +Leveraging Google's Perspective API, you can now set a Toxicity Threshold for Talk (0.8 or 80% is the default), which works like this: + +- If a comment exceeds the threshold, the commenter is warned that their comment may be toxic, and are given the chance to modify their comment before posting + +- If the revised comment is below the Toxicity Threshold, it is posted and displayed normally + +- If the revised comment still exceeds the Toxicity Threshold, it is not displayed on the stream and instead is sent to the Reported queue for moderation + +- If the moderator accepts the comment, it's displayed on the stream; if it's rejected, it will not be displayed + +- Moderators see a Toxic Probability Score on toxic comments in the Moderation queues + +Read more about Coral’s take on toxicity [on our blog](https://blog.coralproject.net/toxic-avenging/). + + +### What is the Perspective API? + +The likely toxicity of a comment is evaluated using scores generated from [Perspective API](http://perspectiveapi.com/). This is part of the [Conversation AI](https://conversationai.github.io/) research effort run by Jigsaw (a section of Google that works on global problems around speech and access to information). + +Perspective API uses machine learning, based on existing databases of accepted/rejected comments, to guess the probability that a comment is abusive and/or toxic. It is currently English only, but the system is designed to work with multiple languages. + +In order to activate our plugin, each news organization applies for an API key from Jigsaw (click “Request API access” on this site.) Sites can also work with Jigsaw to create an individualized data set specifically trained on their own comment history. + +Perspective API was released earlier this year, and is currently in alpha (meaning that it is being continually refined and improved.) Jigsaw should certainly be praised for devoting serious resources to this issue, and making their work available for others, including us, to use. + +We’ve talked with their team on several occasions, and have been impressed by their dedication and commitment to this issue. These are smart people who are trying to improve a broken part of the internet. + + +### How do I add the Toxic Comments plugin to my Talk? + +You can turn on this plugin by including talk-plugin-toxic-comments (as well as talk-plugin-flag-details, see above) in your plugins.json + +Environment variables for configuration: + +- `TALK_PERSPECTIVE_API_KEY` (required) + +- `TALK_TOXICITY_THRESHOLD` (optional, default 0.8) + +- `TALK_PERSPECTIVE_API_ENDPOINT` (optional, default https://commentanalyzer.googleapis.com/v1alpha1) + +- `TALK_PERSPECTIVE_TIMEOUT` (optional, default 300) + +Note: this is a beta plugin and will see a lot of changes/improvement in the coming weeks) + + +### Request an API Key + +You can read more about Google's Perspective API and/or request an API key here: [http://perspectiveapi.com/](http://perspectiveapi.com/). diff --git a/docs/_docs/product-guide-trust.md b/docs/_docs/product-guide-trust.md index dcdc7a5ff..510d451f9 100644 --- a/docs/_docs/product-guide-trust.md +++ b/docs/_docs/product-guide-trust.md @@ -1,6 +1,6 @@ --- title: Trust -permalink: /trust// +permalink: /trust/ class: product-guide --- From 97eee92499512d715f6c6ca1bcdda0700d76cbd0 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 11 Oct 2017 15:32:25 -0600 Subject: [PATCH 13/19] updated docs --- docs/_data/nav.yaml | 18 ++- ...quickstart.md => 01-01-talk-quickstart.md} | 0 ...r.md => 01-02-installation-from-docker.md} | 0 ...e.md => 01-03-installation-from-source.md} | 0 ...ion.md => 02-01-required-configuration.md} | 0 ...ion.md => 02-02-advanced-configuration.md} | 0 ...-overview.md => 03-01-plugins-overview.md} | 0 docs/_docs/03-02-default-plugins.md | 151 ++++++++++++++++++ docs/_docs/03-03-additional-plugins.md | 106 ++++++++++++ docs/_docs/03-04-plugin-recipes.md | 50 ++++++ .../04-01-product-guide-how-talk-works.md | 40 +++++ docs/_docs/04-02-product-guide-trust.md | 49 ++++++ .../04-03-product-guide-toxic-comments.md | 53 ++++++ docs/_docs/product-guide-how-talk-works.md | 23 --- .../product-guide-plugins-and-recipes.md | 91 ----------- docs/_docs/product-guide-toxic-comments.md | 54 ------- docs/_docs/product-guide-trust.md | 32 ---- docs/_layouts/doc.html | 2 +- docs/_sass/talk.scss | 11 +- plugins.default.json | 28 ++-- .../talk-plugin-toxic-comments/package.json | 5 +- .../server/config.js | 4 +- plugins/talk-plugin-toxic-comments/yarn.lock | 3 + 23 files changed, 494 insertions(+), 226 deletions(-) rename docs/_docs/{installation-talk-quickstart.md => 01-01-talk-quickstart.md} (100%) rename docs/_docs/{installation-from-docker.md => 01-02-installation-from-docker.md} (100%) rename docs/_docs/{installation-from-source.md => 01-03-installation-from-source.md} (100%) rename docs/_docs/{running-required-configuration.md => 02-01-required-configuration.md} (100%) rename docs/_docs/{running-advanced-configuration.md => 02-02-advanced-configuration.md} (100%) rename docs/_docs/{plugins-overview.md => 03-01-plugins-overview.md} (100%) create mode 100644 docs/_docs/03-02-default-plugins.md create mode 100644 docs/_docs/03-03-additional-plugins.md create mode 100644 docs/_docs/03-04-plugin-recipes.md create mode 100644 docs/_docs/04-01-product-guide-how-talk-works.md create mode 100644 docs/_docs/04-02-product-guide-trust.md create mode 100644 docs/_docs/04-03-product-guide-toxic-comments.md delete mode 100644 docs/_docs/product-guide-how-talk-works.md delete mode 100644 docs/_docs/product-guide-plugins-and-recipes.md delete mode 100644 docs/_docs/product-guide-toxic-comments.md delete mode 100644 docs/_docs/product-guide-trust.md diff --git a/docs/_data/nav.yaml b/docs/_data/nav.yaml index 96f00edaa..eeb7c2ebc 100644 --- a/docs/_data/nav.yaml +++ b/docs/_data/nav.yaml @@ -13,17 +13,21 @@ items: url: /configuration/ - title: Advanced Configuration url: /advanced-configuration/ - - title: Plugins - children: - - title: Plugins Overview - url: /plugins/ - title: Product Guide - children: + children: - title: How Talk Works url: /how-talk-works/ - - title: Plugin and Recipe List - url: /plugins-and-recipes/ - title: Trust url: /trust/ - title: Toxic Comments url: /toxic-comments/ + - title: Plugins + children: + - title: Plugins Overview + url: /plugins/ + - title: Default Plugins + url: /default-plugins/ + - title: Additional Plugins + url: /additional-plugins/ + - title: Plugin Recipes + url: /plugin-recipes/ diff --git a/docs/_docs/installation-talk-quickstart.md b/docs/_docs/01-01-talk-quickstart.md similarity index 100% rename from docs/_docs/installation-talk-quickstart.md rename to docs/_docs/01-01-talk-quickstart.md diff --git a/docs/_docs/installation-from-docker.md b/docs/_docs/01-02-installation-from-docker.md similarity index 100% rename from docs/_docs/installation-from-docker.md rename to docs/_docs/01-02-installation-from-docker.md diff --git a/docs/_docs/installation-from-source.md b/docs/_docs/01-03-installation-from-source.md similarity index 100% rename from docs/_docs/installation-from-source.md rename to docs/_docs/01-03-installation-from-source.md diff --git a/docs/_docs/running-required-configuration.md b/docs/_docs/02-01-required-configuration.md similarity index 100% rename from docs/_docs/running-required-configuration.md rename to docs/_docs/02-01-required-configuration.md diff --git a/docs/_docs/running-advanced-configuration.md b/docs/_docs/02-02-advanced-configuration.md similarity index 100% rename from docs/_docs/running-advanced-configuration.md rename to docs/_docs/02-02-advanced-configuration.md diff --git a/docs/_docs/plugins-overview.md b/docs/_docs/03-01-plugins-overview.md similarity index 100% rename from docs/_docs/plugins-overview.md rename to docs/_docs/03-01-plugins-overview.md diff --git a/docs/_docs/03-02-default-plugins.md b/docs/_docs/03-02-default-plugins.md new file mode 100644 index 000000000..e43c03b16 --- /dev/null +++ b/docs/_docs/03-02-default-plugins.md @@ -0,0 +1,151 @@ +--- +title: Default Plugins +permalink: /default-plugins/ +class: configuration +--- + +The default Talk plugins can be found in the `plugins.default.json` file +[here](https://github.com/coralproject/talk/blob/master/plugins.default.json). + +Talk ships out of the box with these plugins enabled: + +{% include toc.html %} + +We ship [Additional Plugins]({{ "/additional-plugins/" | relative_url }}) with +Talk that are not enabled by default. You can enable these or disable these +default plugins by consulting the [Plugins Overview]({{ "/plugins/" | relative_url }}) +page. + +## talk-plugin-auth + +Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"} + +Enables generic registration via an email address, a username, a password, and a +password confirmation. To sync Talk auth with your own auth systems, you can use +this plugin as a template. + +## talk-plugin-facebook-auth + +Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"} + +Requires: [talk-plugin-facebook-auth](#talk-plugin-facebook-auth){:.param} + +Enables sign-in via Facebook via the server side passport middleware. + +### Configuration +{:.no_toc} + +- [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param}. +- [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param}. + +## talk-plugin-featured-comments + +Source: [plugins/talk-plugin-featured-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-featured-comments){:target="_blank"} + +Enables the ability for Moderators to feature and un-feature comments via the +Stream and the Admin. Featured comments show in a first-place tab on the Stream +if there are any featured comments on that story. + +## talk-plugin-respect + +Source: [plugins/talk-plugin-respect](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-respect){:target="_blank"} + +Enables a `respect` reaction button. Why a "respect" button, you ask? +[Read more here](https://mediaengagement.org/research/engagement-buttons/). + +## talk-plugin-comment-content + +Source: [plugins/talk-plugin-comment-content](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-comment-content){:target="_blank"} + +Pluginizes the text of a comment to support custom treatment of this text. This +plugin currently parses the given text to see if it contains a link, and makes +them clickable. + +## talk-plugin-ignore-user + +Source: [plugins/talk-plugin-ignore-user](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-ignore-user){:target="_blank"} + +Enables ability for users to ignore (or "mute") other users. If a user is +ignored, you will not see any of their comments. You can un-ignore a user via +the My Profile tab. + +## talk-plugin-permalink + +Source: [plugins/talk-plugin-permalink](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-permalink){:target="_blank"} + +Enables a `Link` button that will provide a permalink to the comment that can be +shared with others. + +## talk-plugin-viewing-options + +Source: [plugins/talk-plugin-viewing-options](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-viewing-options){:target="_blank"} + +Pluginizes the sorting/viewing options for a comment stream. + +## talk-plugin-sort-newest + +Source: [plugins/talk-plugin-sort-newest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-newest){:target="_blank"} + +Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} + +Provides a sort for the newest comments first. This isn't necessarily required +as the default sort without options/plugins is newest first. + +## talk-plugin-sort-oldest + +Source: [plugins/talk-plugin-sort-oldest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-oldest){:target="_blank"} + +Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} + +Provides a sort for the newest comments first. + +## talk-plugin-most-respected + +Source: [plugins/talk-plugin-most-respected](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-respected){:target="_blank"} + +Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}, [talk-plugin-respect](#talk-plugin-respect){:.param} + +Provides a sort for the comments with the most `respect` reactions first. + +## talk-plugin-most-replied + +Source: [plugins/talk-plugin-most-replied](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-replied){:target="_blank"} + +Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} + +Provides a sort for the comments with the most replies first. + +## talk-plugin-offtopic + +Source: [plugins/talk-plugin-offtopic](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-offtopic){:target="_blank"} + +Allows the comment authors to tag their comment as `Off-Topic` which will add a +visible badge on the frontend to other users that their comment is off-topic. + +## talk-plugin-author-menu + +Source: [plugins/talk-plugin-author-menu](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-author-menu){:target="_blank"} + +Pluginizes the author's name on hover. + +## talk-plugin-member-since + +Source: [plugins/talk-plugin-member-since](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-member-since){:target="_blank"} + +Requires: [talk-plugin-author-menu](#talk-plugin-author-menu){:.param} + +Displays the date that the user was created as a `Member Since ${created_at}`. + +## talk-plugin-moderation-actions + +Source: [plugins/talk-plugin-moderation-actions](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-moderation-actions){:target="_blank"} + +Enables in-stream moderation so that Moderators can reject, approve comments, +as well as ban users, directly from the comment stream. When [talk-plugin-featured-comments](#talk-plugin-featured-comments){:.param} is enabled + +## talk-plugin-flag-details + +Source: [plugins/talk-plugin-flag-details](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-flag-details){:target="_blank"} + +Pluginizes the Flag Details area of comments in the Moderation Queues to display +data. Some basic details are already included on flags by default. \ No newline at end of file diff --git a/docs/_docs/03-03-additional-plugins.md b/docs/_docs/03-03-additional-plugins.md new file mode 100644 index 000000000..c04c023df --- /dev/null +++ b/docs/_docs/03-03-additional-plugins.md @@ -0,0 +1,106 @@ +--- +title: Additional Plugins +permalink: /additional-plugins/ +class: configuration +--- + +Talk ships with several plugins that aren't enabled by default: + +{% include toc.html %} + +These plugins can be enabled by consulting the +[Plugins Overview]({{ "/plugins/" | relative_url }}) page. + +## talk-plugin-like + +Source: [plugins/talk-plugin-like](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-like){:target="_blank"} + +Enables a `like` reaction button. + +## talk-plugin-sort-most-liked + +Source: [plugins/talk-plugin-sort-most-liked](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-liked){:target="_blank"} + +Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param}, [talk-plugin-like](#talk-plugin-like){:.param} + +Provides a sort for the comments with the most `like` reactions first. + +## talk-plugin-love + +Source: [plugins/talk-plugin-love](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-love){:target="_blank"} + +Enables a `love` reaction button. + +## talk-plugin-sort-most-loved + +Source: [plugins/talk-plugin-sort-most-loved](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-loved){:target="_blank"} + +Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param}, [talk-plugin-love](#talk-plugin-love){:.param} + +Provides a sort for the comments with the most `love` reactions first. + +## talk-plugin-remember-sort + +Source: [plugins/talk-plugin-remember-sort](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-remember-sort){:target="_blank"} + +Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param} + +Enables saving a user’s last sort selection as they browse other articles. + +## talk-plugin-deep-reply-count + +Source: [plugins/talk-plugin-deep-reply-count](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-deep-reply-count){:target="_blank"} + +Enables counting of comments to include replies via a new graph edge. Not +recommended for large installations as it will unreasonably reduce the query +efficiency to compute this number. + +## talk-plugin-slack-notifications + +Source: [plugins/talk-plugin-slack-notifications](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-slack-notifications){:target="_blank"} + +Enables all new comments that are written to be posted to a Slack channel as +well. Configure an +[Incoming Webhook](https://api.slack.com/incoming-webhooks){:target="_blank"} +app and provide that url in the form of the `SLACK_WEBHOOK_URL` +detailed below. + +*Warning: On high volume sites, this means every single comment will flow into +Slack, if this isn't what you want, be sure to use the provided plugin as a +recipe to further customize the behavior*. + +### Configuration +{:.no_toc} + +- `SLACK_WEBHOOK_URL` (**required**) - The webhook url that will be + used to post new comments to. + +## talk-plugin-toxic-comments + +Source: [plugins/talk-plugin-toxic-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-toxic-comments){:target="_blank"} + +Using the [Perspective API](http://perspectiveapi.com/){:target="_blank"}, this +plugin will warn users and reject comments that exceed the predefined toxicity +threshold. For more information on what Toxic Comments are, check out the +[Toxic Comments]({{ "/toxic-comments/" | relative_url }}) documentation. + +### Configuration +{:.no_toc} + +- `TALK_PERSPECTIVE_API_KEY` (**required**) - The API Key for Perspective. You + can register and get your own key at [http://perspectiveapi.com/](http://perspectiveapi.com/){:target="_blank"}. +- `TALK_TOXICITY_THRESHOLD` - If the comments toxicity exceeds this threshold, + the comment will be rejected. (Default `0.8`) +- `TALK_PERSPECTIVE_API_ENDPOINT` - API Endpoint for hitting the + perspective API. (Default `https://commentanalyzer.googleapis.com/v1alpha1`) +- `TALK_PERSPECTIVE_TIMEOUT` - The timeout for sending a comment to + be processed before it will skip the toxicity analysis, parsed by + [ms](https://www.npmjs.com/package/ms){:target="_blank"}. (Default `300ms`) + +## talk-plugin-subscriber + +Source: [plugins/talk-plugin-subscriber](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-subscriber){:target="_blank"} + +Enables a `Subscriber` badge to be added to comments where the author has the +`SUBSCRIBER` tag. This must match with a custom auth integration that adds the +tag to the users that are subscribed to the service. \ No newline at end of file diff --git a/docs/_docs/03-04-plugin-recipes.md b/docs/_docs/03-04-plugin-recipes.md new file mode 100644 index 000000000..019ff21e4 --- /dev/null +++ b/docs/_docs/03-04-plugin-recipes.md @@ -0,0 +1,50 @@ +--- +title: Plugin Recipes +permalink: /plugin-recipes/ +class: configuration +--- + +Plugin Recipes are plugin templates used to help bootstrap the development of a +plugin. Recipes are available at the +[coralproject/talk-recipes](https://github.com/coralproject/talk-recipes) repo. +When first developing a plugin with a recipe, you can simply visit the +aforementioned repository to find the desired recipe, and using the file +listings on the page, determine which files need to be modified to suit your +needs. + +The following are the available recipes for use: + +{% include toc.html %} + +## recipe-avatar + +Source: [talk-recipes/tree/master/plugins/avatar](https://github.com/coralproject/talk-recipes/tree/master/plugins/avatar){:target="_blank"} + +Provides support for avatars hosted via third party, extends the User Model and +provides UI on the client-side too. + + +## recipe-translations + +Source: [talk-recipes/tree/master/plugins/translations](https://github.com/coralproject/talk-recipes/tree/master/plugins/translations){:target="_blank"} + +Provides an example for overriding application text through the translation +system. + + +## recipe-subscriber + +Source: [talk-recipes/tree/master/plugins/subscriber](https://github.com/coralproject/talk-recipes/tree/master/plugins/subscriber){:target="_blank"} + +Provides an example for adding `SUBSCRIBER` badges for users with the +`SUBSCRIBER` tag added to their user model through a direct server plugin with +the auth system. + + +## recipe-author-name + +Source: [talk-recipes/tree/master/plugins/author-name](https://github.com/coralproject/talk-recipes/tree/master/plugins/author-name){:target="_blank"} + +Enables the ability to hover over a commenter’s name and add plugin +functionality there. The Member Since plugin that is provided in this recipe is +an example of this. diff --git a/docs/_docs/04-01-product-guide-how-talk-works.md b/docs/_docs/04-01-product-guide-how-talk-works.md new file mode 100644 index 000000000..01931872c --- /dev/null +++ b/docs/_docs/04-01-product-guide-how-talk-works.md @@ -0,0 +1,40 @@ +--- +title: How Talk Works +permalink: /how-talk-works/ +--- + +Talk is an open-source commenting platform. It has two pieces. One is the +embedded script, which allows newsrooms to have a unique comments section on +each story/post/page they have on their site, and allows their readers to +comment and discuss articles. The other is the Admin, which is where newsrooms +moderate their comments and manage and configure Talk. + +## Talk Core + +As we’re building Talk, our vision was always to have it be very modular, so +there are features we have built and are opinionated about, but we allow +newsrooms and their developers to customize Talk easily so that it fits their +use cases and needs. + +Talk Core is the core application of Talk - this contains all of the standard +commenting features that are necessary for a comment section, and ones that we +believe are important to be universal. If you would like to contribute to Talk, +be sure to check out our +[Contributor's Guide](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md){:target="_blank"}. + +## Plugins + +Plugins are additional functionality which are optional to use with Talk. You +can turn these on or off, depending on your specific needs. Plugins are either +part of our core plugins, which ship with Talk, or they are developed by 3rd +parties and either used privately and internally, or are open sourced for use +across the greater community. You can explore the plugins we offer by vising our [Default Plugins]({{ "/default-plugins/" | relative_url}}) +and [Additional Plugins]({{ "/additional-plugins/" | relative_url }}) pages. + +## Recipes + +Recipes are plugin templates that are created by the Talk team and 3rd party +developers, in order to help contributors and newsrooms build plugins easily. +You can explore the recipes we offer by vising our [Plugin Recipes]({{ "/plugin-recipes/" | relative_url}}) +page. + diff --git a/docs/_docs/04-02-product-guide-trust.md b/docs/_docs/04-02-product-guide-trust.md new file mode 100644 index 000000000..e0dd90182 --- /dev/null +++ b/docs/_docs/04-02-product-guide-trust.md @@ -0,0 +1,49 @@ +--- +title: Trust +permalink: /trust/ +--- + +Trust is a set of components within Talk that incorporate automated moderation +behaviors based on a user interactions. + +### User Karma Score + +Using Trust’s calculations, Talk will automatically pre-moderate comments of +users who have a negative karma score. All users start out with a `0` neutral +karma score. If they have a comment approved by a moderator, their score +increases by `1`; if they have a comment rejected by a moderator, it decreases +by `1`. When a commenter is labeled as Unreliable, their comments must be +moderated before they are posted. + +When a commenter has one comment rejected, their next comment must be moderated +once in order to post freely again. If they instead get rejected again, then +they must have two of their comments approved in order to get added back to the +queue. + +Here are the default thresholds: + +```text +-2 and lower: Unreliable +-1 to +2: Neutral ++3 and higher: Reliable +``` + +You can configure your own Trust thresholds by using [TRUST_THRESHOLD]({{"/advanced-configuration/#trust_thresholds" | relative_url }}{:.param} in your +configuration. + + +### Reliable and Unreliable Flaggers + +Trust also calculates how reliable users are in terms of the comments they +report. This information is displayed to moderators in the User History drawer, +which is accessed by clicking on a user’s name in the Admin. + +If a user's reports mostly match what moderators reject, their Report status +will display to moderators as Reliable in the user information drawer. If a +user's reports mostly differ from what moderators reject, their Report status +will show as Unreliable. + +If we don't have enough reports to make a call, or the reports even out, their +status is Neutral. + +Note: Report Karma doesn't include reports of "I don't agree with this comment". diff --git a/docs/_docs/04-03-product-guide-toxic-comments.md b/docs/_docs/04-03-product-guide-toxic-comments.md new file mode 100644 index 000000000..f3dd506ba --- /dev/null +++ b/docs/_docs/04-03-product-guide-toxic-comments.md @@ -0,0 +1,53 @@ +--- +title: Toxic Comments +permalink: /toxic-comments/ +--- + +Leveraging Google's Perspective API, you can now set a Toxicity Threshold for +Talk (0.8 or 80% is the default), which works like this: + +- If a comment exceeds the threshold, the commenter is warned that their comment + may be toxic, and are given the chance to modify their comment before posting +- If the revised comment is below the Toxicity Threshold, it is posted and + displayed normally +- If the revised comment still exceeds the Toxicity Threshold, it is not + displayed on the stream and instead is sent to the Reported queue for + moderation +- If the moderator accepts the comment, it's displayed on the stream; if it's + rejected, it will not be displayed +- Moderators see a Toxic Probability Score on toxic comments in the Moderation + queues + +Read more about Coral’s take on toxicity +[on our blog](https://blog.coralproject.net/toxic-avenging/){:target="_blank"}. + +To enable this behavior, visit the +[talk-plugin-toxic-comments]({{ "/additional-plugins/#talk-plugin-toxic-comments" | relative_url }}) +plugin documentation. + +## What is the Perspective API? + +The likely toxicity of a comment is evaluated using scores generated from +[Perspective API](http://perspectiveapi.com/){:target="_blank"}. This is part of +the [Conversation AI](https://conversationai.github.io/){:target="_blank"} +research effort run by Jigsaw (a section of Google that works on global problems +around speech and access to information). + +Perspective API uses machine learning, based on existing databases of +accepted/rejected comments, to guess the probability that a comment is abusive +and/or toxic. It is currently English only, but the system is designed to work +with multiple languages. + +In order to activate our plugin, each news organization applies for an API key +from Jigsaw (click “Request API access” on this site.) Sites can also work with +Jigsaw to create an individualized data set specifically trained on their own +comment history. + +Perspective API was released earlier this year, and is currently in alpha +(meaning that it is being continually refined and improved.) Jigsaw should +certainly be praised for devoting serious resources to this issue, and making +their work available for others, including us, to use. + +We’ve talked with their team on several occasions, and have been impressed by +their dedication and commitment to this issue. These are smart people who are +trying to improve a broken part of the internet. \ No newline at end of file diff --git a/docs/_docs/product-guide-how-talk-works.md b/docs/_docs/product-guide-how-talk-works.md deleted file mode 100644 index 1fc70eecc..000000000 --- a/docs/_docs/product-guide-how-talk-works.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: How Talk Works -permalink: /how-talk-works/ -class: product-guide ---- - -Talk is an open-source commenting platform. It has two pieces. One is the embedded script, which allows newsrooms to have a unique comments section on each story/post/page they have on their site, and allows their readers to comment and discuss articles. The other is the Admin, which is where newsrooms moderate their comments and manage and configure Talk. - -### What is Talk Core? - -As we’re building Talk, our vision was always to have it be very modular, so there are features we have built and are opinionated about, but we allow newsrooms and their developers to customize Talk easily so that it fits their use cases and needs. - -Talk Core is the core application of Talk - this contains all of the standard commenting features that are necessary for a comment section, and ones that we believe are important to be universal. - -### What are Plugins? - -Plugins are additional functionality which are optional to use with Talk. You can turn these on or off, depending on your specific needs. Plugins are either part of our core plugins, which ship with Talk, or they are developed by 3rd parties and either used privately and internally, or are open sourced for use across the greater community. - - -### What are Recipes? - -Recipes are plugin templates that are created by the Talk team and 3rd party developers, in order to help contributors and newsrooms build plugins easily. - diff --git a/docs/_docs/product-guide-plugins-and-recipes.md b/docs/_docs/product-guide-plugins-and-recipes.md deleted file mode 100644 index aed661adb..000000000 --- a/docs/_docs/product-guide-plugins-and-recipes.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Plugin and Recipe List -permalink: /plugins-and-recipes/ -class: product-guide ---- - -### Default Plugins - -The default Talk plugins can be found in the `plugins.default.json` file [here](https://github.com/coralproject/talk/blob/master/plugins.default.json). - -Talk ships out of the box with these plugins: - -#### Auth `talk-plugin-auth` - -Enables generic registration via an email address, a username, a password, and a password confirmation. To sync Talk auth with your own auth systems, you can use this plugin as a template. - -#### Facebook Auth `talk-plugin-facebook-auth` - -Enables sign-in via Facebook. - -#### Comment Content `talk-plugin-comment-content` - -Pluginizes the text of a comment to support custom treatment of this text. By default, we linkify urls so they are clickable. - -#### Respect `talk-plugin-respect` - -Enables a Respect reaction button. Why a “respect” button, you ask? [Read more here](https://mediaengagement.org/research/engagement-buttons/). - -#### Ignore User `talk-plugin-ignore-user` - -Enables ability for users to ignore (or “mute”) other users. If a user is ignored, you will not see any of their comments. You can un-ignore a user via the My Profile tab. - -#### Permalinks `talk-plugin-permalink` - -#### Featured Comments `talk-plugin-featured-comments` - -Enables the ability for Moderators to feature and un-feature comments via the Stream and the Admin. Featured comments show in a first-place tab on the Stream if there are any featured comments on that story. - -#### Viewing Options `talk-plugin-viewing-options` - -##### Sorting Options `talk-plugin-sort-newest`, `talk-plugin-sort-oldest`, `talk-plugin-most-respected`, `talk-plugin-most-replied` - -##### Off-topic `talk-plugin-offtopic` - -#### Author Menu `talk-plugin-author-menu` - -##### Member Since `talk-plugin-member-since` - -#### In-Stream Moderation `talk-plugin-moderation-actions` - -Enables in-stream moderation so that Moderators can reject, approve, and feature comments, as well as ban users, directly from the comment stream. - -#### Moderation Flag Details `talk-plugin-flag-details` - -Enables other plugins to use the Flag Details area of comments in the Moderation Queues to display data. - - -### Additional Plugins - -#### Like `talk-plugin-like` - -Provides a `like` reaction button. Can also be added to the Viewing Options sorts by including `talk-plugin-most-liked`. - -#### Love `talk-plugin-love` - -Provides a `love` reaction button. Can also be added to the Viewing Options sorts by including `talk-plugin-most-loved`. - -#### Remember Sort `talk-plugin-remember-sort` - -Enables saving a user’s last sort selection as they browse other articles. - -#### Deep Reply Count `talk-plugin-deep-reply-count` - -Enables counting of comments to include replies. Requires dev work to enable this fully. - -### Recipes - -Recipes are available here: -https://github.com/coralproject/talk-recipes - -#### Avatars `recipe-avatar` - -Provides support for commenter avatars. - -#### Subscriber Badge `recipe-subscriber` - -Provides support for badges for `subscribers`. - -#### Author Name `recipe-author-name` - -Enables the ability to hover over a commenter’s name and add plugin functionality there. The Member Since plugin is an example of this. diff --git a/docs/_docs/product-guide-toxic-comments.md b/docs/_docs/product-guide-toxic-comments.md deleted file mode 100644 index f72066c46..000000000 --- a/docs/_docs/product-guide-toxic-comments.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Toxic Comments -permalink: /toxic-comments/ -class: product-guide ---- - -Leveraging Google's Perspective API, you can now set a Toxicity Threshold for Talk (0.8 or 80% is the default), which works like this: - -- If a comment exceeds the threshold, the commenter is warned that their comment may be toxic, and are given the chance to modify their comment before posting - -- If the revised comment is below the Toxicity Threshold, it is posted and displayed normally - -- If the revised comment still exceeds the Toxicity Threshold, it is not displayed on the stream and instead is sent to the Reported queue for moderation - -- If the moderator accepts the comment, it's displayed on the stream; if it's rejected, it will not be displayed - -- Moderators see a Toxic Probability Score on toxic comments in the Moderation queues - -Read more about Coral’s take on toxicity [on our blog](https://blog.coralproject.net/toxic-avenging/). - - -### What is the Perspective API? - -The likely toxicity of a comment is evaluated using scores generated from [Perspective API](http://perspectiveapi.com/). This is part of the [Conversation AI](https://conversationai.github.io/) research effort run by Jigsaw (a section of Google that works on global problems around speech and access to information). - -Perspective API uses machine learning, based on existing databases of accepted/rejected comments, to guess the probability that a comment is abusive and/or toxic. It is currently English only, but the system is designed to work with multiple languages. - -In order to activate our plugin, each news organization applies for an API key from Jigsaw (click “Request API access” on this site.) Sites can also work with Jigsaw to create an individualized data set specifically trained on their own comment history. - -Perspective API was released earlier this year, and is currently in alpha (meaning that it is being continually refined and improved.) Jigsaw should certainly be praised for devoting serious resources to this issue, and making their work available for others, including us, to use. - -We’ve talked with their team on several occasions, and have been impressed by their dedication and commitment to this issue. These are smart people who are trying to improve a broken part of the internet. - - -### How do I add the Toxic Comments plugin to my Talk? - -You can turn on this plugin by including talk-plugin-toxic-comments (as well as talk-plugin-flag-details, see above) in your plugins.json - -Environment variables for configuration: - -- `TALK_PERSPECTIVE_API_KEY` (required) - -- `TALK_TOXICITY_THRESHOLD` (optional, default 0.8) - -- `TALK_PERSPECTIVE_API_ENDPOINT` (optional, default https://commentanalyzer.googleapis.com/v1alpha1) - -- `TALK_PERSPECTIVE_TIMEOUT` (optional, default 300) - -Note: this is a beta plugin and will see a lot of changes/improvement in the coming weeks) - - -### Request an API Key - -You can read more about Google's Perspective API and/or request an API key here: [http://perspectiveapi.com/](http://perspectiveapi.com/). diff --git a/docs/_docs/product-guide-trust.md b/docs/_docs/product-guide-trust.md deleted file mode 100644 index 510d451f9..000000000 --- a/docs/_docs/product-guide-trust.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Trust -permalink: /trust/ -class: product-guide ---- - -“Trust” are components within Talk that incorporate automated moderation features based on a user’s previous behavior. - -### User Karma Score - -Using Trust’s calculations, Talk will automatically pre-moderate comments of users who have a negative karma score. All users start out with a `0` neutral karma score. If they have a comment approved by a moderator, their score increases by 1; if they have a comment rejected by a moderator, it decreases by 1. When a commenter is labeled as Unreliable, their comments must be moderated before they are posted. - -When a commenter has one comment rejected, their next comment must be moderated once in order to post freely again. If they instead get rejected again, then they must have two of their comments approved in order to get added back to the queue. - -Here are the default thresholds: - --2 and lower: Unreliable --1 to +2: Neutral -+3 and higher: Reliable - -You can configure your own Trust thresholds by using `TRUST_THRESHOLD` in your configuration. [https://coralproject.github.io/talk/advanced-configuration/#trust_thresholds](Learn more about how to configure Trust here). - - -### Reliable and Unreliable Flaggers - -Trust also calculates how reliable users are in terms of the comments they report. This information is displayed to moderators in the User History drawer, which is accessed by clicking on a user’s name in the Admin. - -If a user's reports mostly match what moderators reject, their Report status will display to moderators as Reliable in the user information drawer. If a user's reports mostly differ from what moderators reject, their Report status will show as Unreliable. - -If we don't have enough reports to make a call, or the reports even out, their status is Neutral. - -Note: Report Karma doesn't include reports of "I don't agree with this comment". diff --git a/docs/_layouts/doc.html b/docs/_layouts/doc.html index 0325ea9fe..53d49adf0 100644 --- a/docs/_layouts/doc.html +++ b/docs/_layouts/doc.html @@ -2,7 +2,7 @@ layout: default --- - Suggest Edits + Suggest Edits

{{ page.title }}


diff --git a/docs/_sass/talk.scss b/docs/_sass/talk.scss index f33cf09db..7597275c3 100644 --- a/docs/_sass/talk.scss +++ b/docs/_sass/talk.scss @@ -36,13 +36,17 @@ h2, h3, h4 { } } +.param { + font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + article.configuration { h2 { font-weight: bolder; } - h2, .toc, .param { - font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + h2, .toc { + @extend .param; } } @@ -260,6 +264,9 @@ pre { p a:not(.plain-link) { @extend .coral-link; } + ul:not(.toc__menu) li a { + @extend .coral-link; + } } } diff --git a/plugins.default.json b/plugins.default.json index a26a38c8e..e6d1b23cb 100644 --- a/plugins.default.json +++ b/plugins.default.json @@ -1,27 +1,27 @@ { "server": [ "talk-plugin-auth", - "talk-plugin-respect", - "talk-plugin-offtopic", "talk-plugin-facebook-auth", - "talk-plugin-featured-comments" + "talk-plugin-featured-comments", + "talk-plugin-offtopic", + "talk-plugin-respect" ], "client": [ - "talk-plugin-respect", "talk-plugin-auth", - "talk-plugin-offtopic", - "talk-plugin-viewing-options", + "talk-plugin-author-menu", "talk-plugin-comment-content", - "talk-plugin-permalink", "talk-plugin-featured-comments", + "talk-plugin-flag-details", + "talk-plugin-ignore-user", + "talk-plugin-member-since", + "talk-plugin-moderation-actions", + "talk-plugin-offtopic", + "talk-plugin-permalink", + "talk-plugin-respect", + "talk-plugin-sort-most-replied", + "talk-plugin-sort-most-respected", "talk-plugin-sort-newest", "talk-plugin-sort-oldest", - "talk-plugin-sort-most-respected", - "talk-plugin-sort-most-replied", - "talk-plugin-author-menu", - "talk-plugin-member-since", - "talk-plugin-ignore-user", - "talk-plugin-moderation-actions", - "talk-plugin-flag-details" + "talk-plugin-viewing-options" ] } diff --git a/plugins/talk-plugin-toxic-comments/package.json b/plugins/talk-plugin-toxic-comments/package.json index 848e6d948..f941e1b6c 100644 --- a/plugins/talk-plugin-toxic-comments/package.json +++ b/plugins/talk-plugin-toxic-comments/package.json @@ -5,5 +5,8 @@ "description": "Provides support for measuring the toxicity of user comments using the Perspectives API", "main": "index.js", "author": "The Coral Project Team ", - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "ms": "^2.0.0" + } } diff --git a/plugins/talk-plugin-toxic-comments/server/config.js b/plugins/talk-plugin-toxic-comments/server/config.js index bc7ddf138..e60d56dd1 100644 --- a/plugins/talk-plugin-toxic-comments/server/config.js +++ b/plugins/talk-plugin-toxic-comments/server/config.js @@ -1,8 +1,10 @@ +const ms = require('ms'); + const config = { API_ENDPOINT: process.env.TALK_PERSPECTIVE_API_ENDPOINT || 'https://commentanalyzer.googleapis.com/v1alpha1', API_KEY: process.env.TALK_PERSPECTIVE_API_KEY, THRESHOLD: process.env.TALK_TOXICITY_THRESHOLD || 0.8, - API_TIMEOUT: process.env.TALK_PERSPECTIVE_TIMEOUT || 300, + API_TIMEOUT: ms(process.env.TALK_PERSPECTIVE_TIMEOUT || '300ms'), }; if (process.env.NODE_ENV !== 'test' && !config.API_KEY) { diff --git a/plugins/talk-plugin-toxic-comments/yarn.lock b/plugins/talk-plugin-toxic-comments/yarn.lock index fb57ccd13..f73f43463 100644 --- a/plugins/talk-plugin-toxic-comments/yarn.lock +++ b/plugins/talk-plugin-toxic-comments/yarn.lock @@ -2,3 +2,6 @@ # yarn lockfile v1 +ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" From 94f4c57038a9300c8fb4aa8230972731af1b4dd0 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 11 Oct 2017 15:38:08 -0600 Subject: [PATCH 14/19] patched --- yarn.lock | 586 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 561 insertions(+), 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index ea67cd008..5e3b02718 100644 --- a/yarn.lock +++ b/yarn.lock @@ -76,6 +76,10 @@ abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +abbrev@^1.0.7: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + accepts@^1.3.4, accepts@~1.3.3: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" @@ -142,6 +146,15 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" +ajv@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + ajv@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" @@ -175,7 +188,7 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0: +ansi-escapes@^1.1.0, ansi-escapes@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -209,6 +222,10 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansicolors@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + any-promise@^0.1.0, any-promise@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-0.1.0.tgz#830b680aa7e56f33451d4b049f3bd8044498ee27" @@ -266,6 +283,10 @@ aproba@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" @@ -364,7 +385,7 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@1.x, async@^1.4.0, async@^1.5.2: +async@1.x, async@^1.4.0, async@^1.5.2, async@~1.5: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1130,7 +1151,18 @@ bowser@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.7.2.tgz#b94cc6925ba6b5e07c421a58e601ce4611264572" -brace-expansion@^1.1.7: +boxen@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.3.1.tgz#a7d898243ae622f7abb6bb604d740a76c6a5461b" + dependencies: + chalk "^1.1.1" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: @@ -1322,6 +1354,10 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000662" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000662.tgz#616b17a525b52fec14611f88af3d5a9b5438c050" +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1547,6 +1583,20 @@ clipboard@^1.7.1: select "^1.1.2" tiny-emitter "^2.0.0" +clite@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/clite/-/clite-0.3.0.tgz#e7fcbc8cc5bd3e7f8b84ed48db12e9474cc73441" + dependencies: + abbrev "^1.0.7" + debug "^2.2.0" + es6-promise "^3.1.2" + lodash.defaults "^4.0.1" + lodash.defaultsdeep "^4.3.1" + lodash.mergewith "^4.3.1" + then-fs "^2.0.0" + update-notifier "^0.6.0" + yargs "^4.3.2" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -1563,6 +1613,15 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +clone-deep@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.1" + kind-of "^3.2.2" + shallow-clone "^0.1.2" + clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" @@ -1726,7 +1785,7 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^1.0.0: +configstore@^1.0.0, configstore@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" dependencies: @@ -1739,6 +1798,20 @@ configstore@^1.0.0: write-file-atomic "^1.1.2" xdg-basedir "^2.0.0" +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + connect@3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" @@ -1867,6 +1940,12 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + create-hash@^1.1.0, create-hash@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" @@ -2113,6 +2192,12 @@ debug@2.6.8, debug@^2.2.0, debug@^2.6.8: dependencies: ms "2.0.0" +debug@^2.1.2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + debug@~0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" @@ -2305,6 +2390,12 @@ dont-sniff-mimetype@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + dotenv@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" @@ -2313,6 +2404,12 @@ double-ended-queue@^2.1.0-0: version "2.1.0-0" resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" +duplexer2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -2471,7 +2568,7 @@ es6-promise@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" -es6-promise@^3.0.2: +es6-promise@^3.0.2, es6-promise@^3.1.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -2858,6 +2955,10 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + finalhandler@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" @@ -2931,6 +3032,10 @@ flexbuffer@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30" +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2941,6 +3046,12 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -3291,6 +3402,26 @@ got@^3.2.0: read-all-stream "^3.0.0" timed-out "^2.0.0" +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + gql-format@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/gql-format/-/gql-format-0.0.4.tgz#8237de7647de37f00aba2d0073abf6087e2da119" @@ -3322,6 +3453,12 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +graphlib@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.1.tgz#42352c52ba2f4d035cb566eb91f7395f76ebc951" + dependencies: + lodash "^4.11.1" + graphql-anywhere@^3.0.0, graphql-anywhere@^3.0.1, graphql-anywhere@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-3.1.0.tgz#3ea0d8e8646b5cee68035016a9a7557c15c21e96" @@ -3479,6 +3616,12 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" +hasbin@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/hasbin/-/hasbin-1.2.3.tgz#78c5926893c80215c2b568ae1fd3fcab7a2696b0" + dependencies: + async "~1.5" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" @@ -3670,6 +3813,10 @@ iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.18" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" +iconv-lite@^0.4.4: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + icss-replace-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz#cb0b6054eb3af6edc9ab1d62d01933e2d4c8bfa5" @@ -3746,7 +3893,7 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.3.0, ini@~1.3.0: +ini@1.x.x, ini@^1.3.0, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -3788,6 +3935,24 @@ inquirer@0.8.2: rx "^2.4.3" through "^2.3.6" +inquirer@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.0.3.tgz#ebe3a0948571bcc46ccccbe2f9bcec251e984bd0" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + mute-stream "0.0.6" + pinkie-promise "^2.0.0" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + inquirer@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" @@ -3894,7 +4059,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" @@ -4006,6 +4171,10 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -4026,6 +4195,12 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -4054,6 +4229,10 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + is-ssh@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.0.tgz#ebea1169a2614da392a63740366c3ce049d8dff6" @@ -4116,6 +4295,10 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -4513,6 +4696,13 @@ js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.5.3: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -4710,12 +4900,24 @@ keymaster@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/keymaster/-/keymaster-1.6.2.tgz#e1ae54d0ea9488f9f60b66b668f02e9a1946c6eb" +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + dependencies: + is-buffer "^1.0.2" + kind-of@^3.0.2: version "3.2.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" dependencies: is-buffer "^1.1.5" +kind-of@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -4751,6 +4953,12 @@ latest-version@^1.0.0: dependencies: package-json "^1.0.0" +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + dependencies: + package-json "^2.0.0" + lazy-ass@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.3.0.tgz#7d0d14eef3ec9702c6f30c60ea81f1a8d3f900fb" @@ -4763,6 +4971,10 @@ lazy-ass@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -4932,7 +5144,7 @@ lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" -lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.3.1, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -4951,10 +5163,14 @@ lodash.defaults@^3.1.2: lodash.assign "^3.0.0" lodash.restparam "^3.0.0" -lodash.defaults@^4.2.0: +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" +lodash.defaultsdeep@^4.3.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + lodash.difference@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" @@ -5019,6 +5235,10 @@ lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" +lodash.mergewith@^4.3.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + lodash.noop@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" @@ -5075,7 +5295,7 @@ lodash@3.7.x: version "3.7.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" -lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -5115,6 +5335,13 @@ lru-cache@^2.5.0: version "2.6.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5" +lru-cache@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -5264,10 +5491,14 @@ mime-types@~2.0.3: dependencies: mime-db "~1.12.0" -mime@1.3.4, mime@1.3.x, mime@^1.3.4: +mime@1.3.4, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -5286,14 +5517,27 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" +minimatch@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.2.tgz#0f398a7300ea441e9c348c83d98ab8c9dbf9c40a" + dependencies: + brace-expansion "^1.0.0" + minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -5416,6 +5660,10 @@ mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -5440,6 +5688,14 @@ natural@^0.2.0: sylvester ">= 0.0.12" underscore ">=1.3.1" +nconf@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.7.2.tgz#a05fdf22dc01c378dd5c4df27f2dc90b9aa8bb00" + dependencies: + async "~0.9.0" + ini "1.x.x" + yargs "~3.15.0" + nconf@^0.8.4: version "0.8.5" resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.8.5.tgz#f2941e1561952fa906bbb32328cf88d4c635e794" @@ -5457,6 +5713,13 @@ nearley@^2.7.10: railroad-diagrams "^1.0.0" randexp "^0.4.2" +needle@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.0.1.tgz#c21fc961ce3c340fb082250da6a08a32f38631f1" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -5580,6 +5843,10 @@ node-redis-warlock@~0.2.0: node-redis-scripty "0.0.5" uuid "^2.0.1" +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + nodemailer-direct-transport@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86" @@ -5809,6 +6076,10 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +open@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + optimist@0.6.1, optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -5849,6 +6120,13 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" +os-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" + dependencies: + osx-release "^1.0.0" + win-release "^1.0.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5860,6 +6138,12 @@ osenv@^0.1.0: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osx-release@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/osx-release/-/osx-release-1.1.0.tgz#f217911a28136949af1bf9308b241e2737d3cd6c" + dependencies: + minimist "^1.1.0" + output-file-sync@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" @@ -5893,6 +6177,15 @@ package-json@^1.0.0: got "^3.2.0" registry-url "^3.0.0" +package-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + pad-right@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" @@ -5922,7 +6215,7 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-json@^2.2.0: +parse-json@^2.1.0, parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: @@ -6572,7 +6865,7 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0: +prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -6609,6 +6902,12 @@ promise-each@^2.2.0: dependencies: any-promise "^0.1.0" +"promise@>=3.2 <8": + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + promise@^7.0.1, promise@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" @@ -6643,7 +6942,7 @@ ps-tree@^1.0.1: dependencies: event-stream "~3.3.0" -pseudomap@^1.0.1: +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -6862,6 +7161,15 @@ rc@^1.0.1, rc@~1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" +rc@^1.1.6: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-apollo@^1.4.12: version "1.4.12" resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-1.4.12.tgz#0cacbdd335acec4c1079feb48047df1c43f77bdf" @@ -7196,7 +7504,14 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -registry-url@^3.0.0: +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.0, registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" dependencies: @@ -7390,6 +7705,10 @@ rx@^2.4.3: version "2.5.3" resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566" +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + safe-buffer@5.1.1, safe-buffer@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -7424,6 +7743,12 @@ sax@^1.1.4, sax@^1.2.1, sax@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + secure-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" @@ -7442,7 +7767,7 @@ semver-regex@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" -"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -7499,6 +7824,15 @@ sha.js@^2.3.6: dependencies: inherits "^2.0.1" +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -7618,6 +7952,144 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +snyk-config@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-1.0.1.tgz#f27aec2498b24027ac719214026521591111508f" + dependencies: + debug "^2.2.0" + nconf "^0.7.2" + path-is-absolute "^1.0.0" + +snyk-go-plugin@1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.3.7.tgz#af57af7132c9e313555b5d8955312b87f016f447" + dependencies: + graphlib "^2.1.1" + toml "^2.3.2" + +snyk-gradle-plugin@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-1.1.2.tgz#9857b808a2bac8d4374ae47a9cef5e127cf56d74" + dependencies: + clone-deep "^0.3.0" + +snyk-module@1.8.1, snyk-module@^1.6.0, snyk-module@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-1.8.1.tgz#31d5080fb1c0dfd6fa8567dd34a523fd02bf1fca" + dependencies: + debug "^2.2.0" + hosted-git-info "^2.1.4" + +snyk-mvn-plugin@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-1.0.3.tgz#2c5ceaebf723ce31497adf18220bce0ad47dc6d8" + +snyk-policy@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.7.1.tgz#e413b6bd4af6050c5e5f445287909e4e98a09b22" + dependencies: + debug "^2.2.0" + es6-promise "^3.1.2" + js-yaml "^3.5.3" + lodash.clonedeep "^4.3.1" + semver "^5.1.0" + snyk-module "^1.8.1" + snyk-resolve "^1.0.0" + snyk-try-require "^1.1.1" + then-fs "^2.0.0" + +snyk-python-plugin@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.2.5.tgz#59e8090c03dbd3232b4b9adadd89566851e6e209" + +snyk-recursive-readdir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/snyk-recursive-readdir/-/snyk-recursive-readdir-2.0.0.tgz#5cb59e94698169e0205a60e7d6a506d0b4d52ff3" + dependencies: + minimatch "3.0.2" + +snyk-resolve-deps@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-1.7.0.tgz#13743a058437dff890baaf437c333c966a743cb6" + dependencies: + abbrev "^1.0.7" + ansicolors "^0.3.2" + clite "^0.3.0" + debug "^2.2.0" + es6-promise "^3.0.2" + lodash "^4.0.0" + lru-cache "^4.0.0" + minimist "^1.2.0" + semver "^5.1.0" + snyk-module "^1.6.0" + snyk-resolve "^1.0.0" + snyk-tree "^1.0.0" + snyk-try-require "^1.1.1" + then-fs "^2.0.0" + +snyk-resolve@1.0.0, snyk-resolve@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.0.0.tgz#bbe9196d37f57c39251e6be75ccdd5b2097e99a2" + dependencies: + debug "^2.2.0" + then-fs "^2.0.0" + +snyk-sbt-plugin@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-1.1.1.tgz#eb8ce1dc5d0da49fb7b3672e34717e196774816f" + +snyk-tree@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/snyk-tree/-/snyk-tree-1.0.0.tgz#0fb73176dbf32e782f19100294160448f9111cc8" + dependencies: + archy "^1.0.0" + +snyk-try-require@^1.1.1, snyk-try-require@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-1.2.0.tgz#30fc2b11c07064591ee35780c826be91312f2144" + dependencies: + debug "^2.2.0" + es6-promise "^3.1.2" + lodash.clonedeep "^4.3.0" + lru-cache "^4.0.0" + then-fs "^2.0.0" + +snyk@^1.42.5: + version "1.42.6" + resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.42.6.tgz#cbbbc41b71f7dbd89a486cf5be7167dd10fecfb3" + dependencies: + abbrev "^1.0.7" + ansi-escapes "^1.3.0" + chalk "^1.1.1" + configstore "^1.2.0" + debug "^2.2.0" + es6-promise "^3.0.2" + hasbin "^1.2.3" + inquirer "1.0.3" + needle "^2.0.1" + open "^0.0.5" + os-name "^1.0.3" + semver "^5.1.0" + snyk-config "1.0.1" + snyk-go-plugin "1.3.7" + snyk-gradle-plugin "1.1.2" + snyk-module "1.8.1" + snyk-mvn-plugin "1.0.3" + snyk-policy "1.7.1" + snyk-python-plugin "1.2.5" + snyk-recursive-readdir "^2.0.0" + snyk-resolve "1.0.0" + snyk-resolve-deps "1.7.0" + snyk-sbt-plugin "1.1.1" + snyk-tree "^1.0.0" + snyk-try-require "^1.2.0" + tempfile "^1.1.1" + then-fs "^2.0.0" + undefsafe "0.0.3" + update-notifier "^0.5.0" + url "^0.11.0" + uuid "^3.0.1" + socks@1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691" @@ -7974,6 +8446,13 @@ tcomb@^2.5.1: version "2.7.0" resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz#10d62958041669a5d53567b9a4ee8cde22b1c2b0" +tempfile@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + test-exclude@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" @@ -7992,6 +8471,12 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +then-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2" + dependencies: + promise ">=3.2 <8" + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -8014,6 +8499,10 @@ timed-out@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + timekeeper@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-1.0.0.tgz#2f38aee1e94b11dd66d8580ff1aa9dcc6a2ba0d8" @@ -8089,6 +8578,10 @@ token-stream@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" +toml@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" + topo@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" @@ -8239,7 +8732,11 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -update-notifier@0.5.0: +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +update-notifier@0.5.0, update-notifier@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" dependencies: @@ -8251,16 +8748,34 @@ update-notifier@0.5.0: semver-diff "^2.0.0" string-length "^1.0.0" +update-notifier@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.6.3.tgz#776dec8daa13e962a341e8a1d98354306b67ae08" + dependencies: + boxen "^0.3.1" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + semver-diff "^2.0.0" + url-join@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.2.tgz#c072756967ad24b8b59e5741551caac78f50b8b7" -url-loader@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" +url-loader@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" dependencies: loader-utils "^1.0.2" - mime "1.3.x" + mime "^1.4.1" + schema-utils "^0.3.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" url-search-params@^0.9.0: version "0.9.0" @@ -8475,11 +8990,23 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.1" +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +win-release@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" + dependencies: + semver "^5.0.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.1.4: +window-size@^0.1.1, window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" @@ -8583,7 +9110,7 @@ y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: +yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -8650,7 +9177,7 @@ yargs@^3.19.0: window-size "^0.1.4" y18n "^3.2.0" -yargs@^4.0.0: +yargs@^4.0.0, yargs@^4.3.2: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" dependencies: @@ -8733,6 +9260,15 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" +yargs@~3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.15.0.tgz#3d9446ef21fb3791b3985690662e4b9683c7f181" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "^0.1.1" + zen-observable-ts@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.4.0.tgz#a74bc9fe59747948a577bd513d438e70fcfae7e2" From 86f48cea9673a990975c5b2dfd71fba6f74b9c99 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 11 Oct 2017 16:41:09 -0600 Subject: [PATCH 15/19] Modified user search to include whole word search --- services/assets.js | 2 +- services/regex.js | 10 ++++++++ services/users.js | 14 +++++++---- services/wordlist.js | 8 +------ test/server/services/users.js | 44 +++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 services/regex.js diff --git a/services/assets.js b/services/assets.js index 8f93de009..4aac2addd 100644 --- a/services/assets.js +++ b/services/assets.js @@ -116,7 +116,7 @@ module.exports = class AssetsService { static search({value, limit, open, sortOrder, cursor} = {}) { let assets = AssetModel.find({}); - if (value) { + if (value && value.length > 0) { assets.merge({ $text: { $search: value diff --git a/services/regex.js b/services/regex.js new file mode 100644 index 000000000..9092df18a --- /dev/null +++ b/services/regex.js @@ -0,0 +1,10 @@ +/** + * Escape string for special regular expression characters. + */ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +module.exports = { + escapeRegExp, +}; diff --git a/services/users.js b/services/users.js index 1dc9bceb6..78708b40a 100644 --- a/services/users.js +++ b/services/users.js @@ -24,6 +24,7 @@ const ActionsService = require('./actions'); const MailerService = require('./mailer'); const Wordlist = require('./wordlist'); const Domainlist = require('./domainlist'); +const {escapeRegExp} = require('./regex'); const EMAIL_CONFIRM_JWT_SUBJECT = 'email_confirm'; const PASSWORD_RESET_JWT_SUBJECT = 'password_reset'; @@ -630,14 +631,19 @@ module.exports = class UsersService { * @return {Promise} */ static search(value) { + if (!value || typeof value !== 'string' || value.length === 0) { + return UserModel.find({}); + } + + value = escapeRegExp(value); + return UserModel.find({ $or: [ // Search by a prefix match on the username. { - 'username': { - $regex: new RegExp(`^${value}`), - $options: 'i' + 'lowercaseUsername': { + $regex: new RegExp(value.toLowerCase()) } }, @@ -646,7 +652,7 @@ module.exports = class UsersService { 'profiles': { $elemMatch: { id: { - $regex: new RegExp(`^${value}`), + $regex: new RegExp(value), $options: 'i' }, provider: 'local' diff --git a/services/wordlist.js b/services/wordlist.js index 8d9ee95bb..601f4bc79 100644 --- a/services/wordlist.js +++ b/services/wordlist.js @@ -3,13 +3,7 @@ const _ = require('lodash'); const SettingsService = require('./settings'); const Errors = require('../errors'); const memoize = require('lodash/memoize'); - -/** - * Escape string for special regular expression characters. - */ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} +const {escapeRegExp} = require('./regex'); /** * Generate a regulare expression that catches the `phrases`. diff --git a/test/server/services/users.js b/test/server/services/users.js index 57d0f3815..251618187 100644 --- a/test/server/services/users.js +++ b/test/server/services/users.js @@ -208,6 +208,50 @@ describe('services.UsersService', () => { }); }); + describe('#search', () => { + it('should return all the results without a value', async () => { + expect(await UsersService.search()).to.have.length(3); + }); + + it('should match the search terms', async () => { + const tests = [ + { + search: 'monster', + results: 1, + id: mockUsers[1].id, + }, + { + search: 'Stamp', + results: 1, + id: mockUsers[0].id, + }, + { + search: 'sockmonster@gmail.com', + results: 1, + id: mockUsers[1].id, + }, + { + search: 'marvel', + results: 1, + id: mockUsers[2].id, + }, + { + search: 'gmail.com', + results: 3 + } + ]; + + for (const test of tests) { + const users = await UsersService.search(test.search); + + expect(users).to.have.length(test.results); + if (test.results === 1) { + expect(users[0]).to.have.property('id', test.id); + } + } + }); + }); + describe('#editName', () => { it('should let the user edit their username if the proper toggle is set', () => { return UsersService From f035a9d1e976e3026cebd5ce08942c1004582b43 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 12 Oct 2017 13:05:13 +0100 Subject: [PATCH 16/19] Flagged Usernames --> Reported Usernames --- locales/en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/en.yml b/locales/en.yml index 92119f125..454d4c2a2 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -57,13 +57,13 @@ en: banned_user: "Banned User" cancel: Cancel dont_like_username: "Dislike username" - flaggedaccounts: "Flagged Usernames" + flaggedaccounts: "Reported Usernames" flags: Flags impersonating: "Impersonation" loading: "Loading results" moderator: Moderator newsroom_role: "Newsroom Role" - no_flagged_accounts: "The Flagged Usernames queue is currently empty." + no_flagged_accounts: "The Reported Usernames queue is currently empty." no_results: "No users found with that user name or email address. They're hiding!" offensive: "Offensive" other: Other From 69acb6d5a0fe5bee23e8dac3f7bd4e851b04df05 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 12 Oct 2017 14:06:09 +0100 Subject: [PATCH 17/19] Fix typos and clean up styling --- docs/Gemfile.lock | 11 --- docs/_docs/02-01-required-configuration.md | 14 ++-- docs/_docs/02-02-advanced-configuration.md | 82 +++++++++---------- docs/_docs/03-01-plugins-overview.md | 2 +- docs/_docs/03-02-default-plugins.md | 39 ++++----- docs/_docs/03-03-additional-plugins.md | 24 +++--- docs/_docs/03-04-plugin-recipes.md | 8 +- .../04-01-product-guide-how-talk-works.md | 4 +- docs/_docs/04-02-product-guide-trust.md | 4 +- .../04-03-product-guide-toxic-comments.md | 18 ++-- docs/_sass/talk.scss | 3 +- 11 files changed, 102 insertions(+), 107 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 62b708a5d..d42fb530c 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -4,11 +4,8 @@ GEM addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) colorator (1.1.0) - cssminify2 (2.0.1) - execjs (2.7.0) ffi (1.9.18) forwardable-extended (2.6.0) - htmlcompressor (0.3.1) jekyll (3.5.2) addressable (~> 2.4) colorator (~> 1.0) @@ -20,11 +17,6 @@ GEM pathutil (~> 0.9) rouge (~> 1.7) safe_yaml (~> 1.0) - jekyll-minifier (0.1.4) - cssminify2 (~> 2.0) - htmlcompressor (~> 0.3) - jekyll (~> 3.5) - uglifier (~> 3.2) jekyll-sass-converter (1.5.0) sass (~> 3.4) jekyll-seo-tag (2.3.0) @@ -50,15 +42,12 @@ GEM sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - uglifier (3.2.0) - execjs (>= 0.3.0, < 3) PLATFORMS ruby DEPENDENCIES jekyll (= 3.5.2) - jekyll-minifier (~> 0.1.4) jekyll-seo-tag (~> 2.1) tzinfo-data diff --git a/docs/_docs/02-01-required-configuration.md b/docs/_docs/02-01-required-configuration.md index 2f5d28049..84a7236db 100644 --- a/docs/_docs/02-01-required-configuration.md +++ b/docs/_docs/02-01-required-configuration.md @@ -19,7 +19,7 @@ If you've already configured your application with the required configuration, you can further customize it's behavior by applying [Advanced Configuration]({{ "/advanced-configuration/" | relative_url }}). -## TALK_MONGO_URL +### TALK_MONGO_URL The database connection string for the MongoDB database. This usually takes the form of: @@ -31,7 +31,7 @@ TALK_MONGO_URL=mongodb://:@:` component of the [TALK_ROOT_URL]({{ "/configuration/#talk_root_url" | relative_url }}){: .param}. @@ -361,7 +361,7 @@ Then all the routes for the API will be expecting to be hit on `/talk/`, such as can perform the path stripping when serving an upstream proxy, but some CDN's cannot. You would use this option in the latter situation. -## TALK_SMTP_EMAIL +### TALK_SMTP_EMAIL The email address to send emails from using the SMTP provider in the format: @@ -371,23 +371,23 @@ TALK_SMTP_EMAIL="The Coral Project" Including the name and email address. -## TALK_SMTP_HOST +### TALK_SMTP_HOST The domain for the SMTP provider that you are using. -## TALK_SMTP_PASSWORD +### TALK_SMTP_PASSWORD The password for the SMTP provider you are using. -## TALK_SMTP_PORT +### TALK_SMTP_PORT The port for the SMTP provider that you are using. -## TALK_SMTP_USERNAME +### TALK_SMTP_USERNAME The username of the SMTP provider you are using. -## TALK_STATIC_URI +### TALK_STATIC_URI Used to set the uri where the static assets should be served from. This is used when you want to upload the static assets through your build process to a @@ -395,14 +395,14 @@ service like Google Cloud Storage or Amazon S3 and you would then specify the CDN/Storage url. (Defaults to value of [TALK_ROOT_URL]({{ "/configuration/#talk_root_url" | relative_url }}){: .param}) -## TALK_THREADING_LEVEL +### TALK_THREADING_LEVEL Specify the maximum depth of the comment thread. (Default `3`) **Note that a high value for `TALK_THREADING_LEVEL` will result in large performance impacts.** -## TALK_WEBSOCKET_LIVE_URI +### TALK_WEBSOCKET_LIVE_URI Used to override the location to connect to the websocket endpoint to potentially another host. This should be used when you need to route websocket @@ -419,7 +419,7 @@ is `FALSE`, or the path component of **Warning: if used without managing the auth state manually, auth cannot be persisted due to browser restrictions.** -## TRUST_THRESHOLDS +### TRUST_THRESHOLDS Configure the reliability thresholds for flagging and commenting. (Default `comment:2,-1;flag:2,-1`) diff --git a/docs/_docs/03-01-plugins-overview.md b/docs/_docs/03-01-plugins-overview.md index 5194bef04..b67ff53be 100644 --- a/docs/_docs/03-01-plugins-overview.md +++ b/docs/_docs/03-01-plugins-overview.md @@ -116,4 +116,4 @@ assets inside the image as well. For more information on the onbuild image, refer to the [Installation from Docker]({{ "/installation-from-docker/" | relative_url }}) -documentation. \ No newline at end of file +documentation. diff --git a/docs/_docs/03-02-default-plugins.md b/docs/_docs/03-02-default-plugins.md index e43c03b16..ab843f21b 100644 --- a/docs/_docs/03-02-default-plugins.md +++ b/docs/_docs/03-02-default-plugins.md @@ -16,7 +16,7 @@ Talk that are not enabled by default. You can enable these or disable these default plugins by consulting the [Plugins Overview]({{ "/plugins/" | relative_url }}) page. -## talk-plugin-auth +### talk-plugin-auth Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"} @@ -24,7 +24,7 @@ Enables generic registration via an email address, a username, a password, and a password confirmation. To sync Talk auth with your own auth systems, you can use this plugin as a template. -## talk-plugin-facebook-auth +### talk-plugin-facebook-auth Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"} @@ -32,13 +32,14 @@ Requires: [talk-plugin-facebook-auth](#talk-plugin-facebook-auth){:.param} Enables sign-in via Facebook via the server side passport middleware. -### Configuration +Configuration: + {:.no_toc} - [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param}. - [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param}. -## talk-plugin-featured-comments +### talk-plugin-featured-comments Source: [plugins/talk-plugin-featured-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-featured-comments){:target="_blank"} @@ -46,14 +47,14 @@ Enables the ability for Moderators to feature and un-feature comments via the Stream and the Admin. Featured comments show in a first-place tab on the Stream if there are any featured comments on that story. -## talk-plugin-respect +### talk-plugin-respect Source: [plugins/talk-plugin-respect](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-respect){:target="_blank"} Enables a `respect` reaction button. Why a "respect" button, you ask? [Read more here](https://mediaengagement.org/research/engagement-buttons/). -## talk-plugin-comment-content +### talk-plugin-comment-content Source: [plugins/talk-plugin-comment-content](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-comment-content){:target="_blank"} @@ -61,7 +62,7 @@ Pluginizes the text of a comment to support custom treatment of this text. This plugin currently parses the given text to see if it contains a link, and makes them clickable. -## talk-plugin-ignore-user +### talk-plugin-ignore-user Source: [plugins/talk-plugin-ignore-user](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-ignore-user){:target="_blank"} @@ -69,20 +70,20 @@ Enables ability for users to ignore (or "mute") other users. If a user is ignored, you will not see any of their comments. You can un-ignore a user via the My Profile tab. -## talk-plugin-permalink +### talk-plugin-permalink Source: [plugins/talk-plugin-permalink](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-permalink){:target="_blank"} Enables a `Link` button that will provide a permalink to the comment that can be shared with others. -## talk-plugin-viewing-options +### talk-plugin-viewing-options Source: [plugins/talk-plugin-viewing-options](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-viewing-options){:target="_blank"} Pluginizes the sorting/viewing options for a comment stream. -## talk-plugin-sort-newest +### talk-plugin-sort-newest Source: [plugins/talk-plugin-sort-newest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-newest){:target="_blank"} @@ -91,7 +92,7 @@ Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} Provides a sort for the newest comments first. This isn't necessarily required as the default sort without options/plugins is newest first. -## talk-plugin-sort-oldest +### talk-plugin-sort-oldest Source: [plugins/talk-plugin-sort-oldest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-oldest){:target="_blank"} @@ -99,7 +100,7 @@ Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} Provides a sort for the newest comments first. -## talk-plugin-most-respected +### talk-plugin-most-respected Source: [plugins/talk-plugin-most-respected](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-respected){:target="_blank"} @@ -107,7 +108,7 @@ Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}, Provides a sort for the comments with the most `respect` reactions first. -## talk-plugin-most-replied +### talk-plugin-most-replied Source: [plugins/talk-plugin-most-replied](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-replied){:target="_blank"} @@ -115,20 +116,20 @@ Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param} Provides a sort for the comments with the most replies first. -## talk-plugin-offtopic +### talk-plugin-offtopic Source: [plugins/talk-plugin-offtopic](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-offtopic){:target="_blank"} Allows the comment authors to tag their comment as `Off-Topic` which will add a visible badge on the frontend to other users that their comment is off-topic. -## talk-plugin-author-menu +### talk-plugin-author-menu Source: [plugins/talk-plugin-author-menu](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-author-menu){:target="_blank"} Pluginizes the author's name on hover. -## talk-plugin-member-since +### talk-plugin-member-since Source: [plugins/talk-plugin-member-since](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-member-since){:target="_blank"} @@ -136,16 +137,16 @@ Requires: [talk-plugin-author-menu](#talk-plugin-author-menu){:.param} Displays the date that the user was created as a `Member Since ${created_at}`. -## talk-plugin-moderation-actions +### talk-plugin-moderation-actions Source: [plugins/talk-plugin-moderation-actions](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-moderation-actions){:target="_blank"} Enables in-stream moderation so that Moderators can reject, approve comments, as well as ban users, directly from the comment stream. When [talk-plugin-featured-comments](#talk-plugin-featured-comments){:.param} is enabled -## talk-plugin-flag-details +### talk-plugin-flag-details Source: [plugins/talk-plugin-flag-details](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-flag-details){:target="_blank"} Pluginizes the Flag Details area of comments in the Moderation Queues to display -data. Some basic details are already included on flags by default. \ No newline at end of file +data. Some basic details are already included on flags by default. diff --git a/docs/_docs/03-03-additional-plugins.md b/docs/_docs/03-03-additional-plugins.md index c04c023df..9be7f1cd2 100644 --- a/docs/_docs/03-03-additional-plugins.md +++ b/docs/_docs/03-03-additional-plugins.md @@ -11,13 +11,13 @@ Talk ships with several plugins that aren't enabled by default: These plugins can be enabled by consulting the [Plugins Overview]({{ "/plugins/" | relative_url }}) page. -## talk-plugin-like +### talk-plugin-like Source: [plugins/talk-plugin-like](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-like){:target="_blank"} Enables a `like` reaction button. -## talk-plugin-sort-most-liked +### talk-plugin-sort-most-liked Source: [plugins/talk-plugin-sort-most-liked](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-liked){:target="_blank"} @@ -25,13 +25,13 @@ Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewin Provides a sort for the comments with the most `like` reactions first. -## talk-plugin-love +### talk-plugin-love Source: [plugins/talk-plugin-love](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-love){:target="_blank"} Enables a `love` reaction button. -## talk-plugin-sort-most-loved +### talk-plugin-sort-most-loved Source: [plugins/talk-plugin-sort-most-loved](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-loved){:target="_blank"} @@ -39,7 +39,7 @@ Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewin Provides a sort for the comments with the most `love` reactions first. -## talk-plugin-remember-sort +### talk-plugin-remember-sort Source: [plugins/talk-plugin-remember-sort](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-remember-sort){:target="_blank"} @@ -47,7 +47,7 @@ Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewin Enables saving a user’s last sort selection as they browse other articles. -## talk-plugin-deep-reply-count +### talk-plugin-deep-reply-count Source: [plugins/talk-plugin-deep-reply-count](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-deep-reply-count){:target="_blank"} @@ -55,7 +55,7 @@ Enables counting of comments to include replies via a new graph edge. Not recommended for large installations as it will unreasonably reduce the query efficiency to compute this number. -## talk-plugin-slack-notifications +### talk-plugin-slack-notifications Source: [plugins/talk-plugin-slack-notifications](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-slack-notifications){:target="_blank"} @@ -69,13 +69,13 @@ detailed below. Slack, if this isn't what you want, be sure to use the provided plugin as a recipe to further customize the behavior*. -### Configuration +Configuration: {:.no_toc} - `SLACK_WEBHOOK_URL` (**required**) - The webhook url that will be used to post new comments to. -## talk-plugin-toxic-comments +### talk-plugin-toxic-comments Source: [plugins/talk-plugin-toxic-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-toxic-comments){:target="_blank"} @@ -84,7 +84,7 @@ plugin will warn users and reject comments that exceed the predefined toxicity threshold. For more information on what Toxic Comments are, check out the [Toxic Comments]({{ "/toxic-comments/" | relative_url }}) documentation. -### Configuration +Configuration: {:.no_toc} - `TALK_PERSPECTIVE_API_KEY` (**required**) - The API Key for Perspective. You @@ -97,10 +97,10 @@ threshold. For more information on what Toxic Comments are, check out the be processed before it will skip the toxicity analysis, parsed by [ms](https://www.npmjs.com/package/ms){:target="_blank"}. (Default `300ms`) -## talk-plugin-subscriber +### talk-plugin-subscriber Source: [plugins/talk-plugin-subscriber](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-subscriber){:target="_blank"} Enables a `Subscriber` badge to be added to comments where the author has the `SUBSCRIBER` tag. This must match with a custom auth integration that adds the -tag to the users that are subscribed to the service. \ No newline at end of file +tag to the users that are subscribed to the service. diff --git a/docs/_docs/03-04-plugin-recipes.md b/docs/_docs/03-04-plugin-recipes.md index 019ff21e4..6b76a54ca 100644 --- a/docs/_docs/03-04-plugin-recipes.md +++ b/docs/_docs/03-04-plugin-recipes.md @@ -16,7 +16,7 @@ The following are the available recipes for use: {% include toc.html %} -## recipe-avatar +### recipe-avatar Source: [talk-recipes/tree/master/plugins/avatar](https://github.com/coralproject/talk-recipes/tree/master/plugins/avatar){:target="_blank"} @@ -24,7 +24,7 @@ Provides support for avatars hosted via third party, extends the User Model and provides UI on the client-side too. -## recipe-translations +### recipe-translations Source: [talk-recipes/tree/master/plugins/translations](https://github.com/coralproject/talk-recipes/tree/master/plugins/translations){:target="_blank"} @@ -32,7 +32,7 @@ Provides an example for overriding application text through the translation system. -## recipe-subscriber +### recipe-subscriber Source: [talk-recipes/tree/master/plugins/subscriber](https://github.com/coralproject/talk-recipes/tree/master/plugins/subscriber){:target="_blank"} @@ -41,7 +41,7 @@ Provides an example for adding `SUBSCRIBER` badges for users with the the auth system. -## recipe-author-name +### recipe-author-name Source: [talk-recipes/tree/master/plugins/author-name](https://github.com/coralproject/talk-recipes/tree/master/plugins/author-name){:target="_blank"} diff --git a/docs/_docs/04-01-product-guide-how-talk-works.md b/docs/_docs/04-01-product-guide-how-talk-works.md index 01931872c..8f8dca6dd 100644 --- a/docs/_docs/04-01-product-guide-how-talk-works.md +++ b/docs/_docs/04-01-product-guide-how-talk-works.md @@ -28,13 +28,13 @@ Plugins are additional functionality which are optional to use with Talk. You can turn these on or off, depending on your specific needs. Plugins are either part of our core plugins, which ship with Talk, or they are developed by 3rd parties and either used privately and internally, or are open sourced for use -across the greater community. You can explore the plugins we offer by vising our [Default Plugins]({{ "/default-plugins/" | relative_url}}) +across the greater community. You can explore the plugins we offer by visiting our [Default Plugins]({{ "/default-plugins/" | relative_url}}) and [Additional Plugins]({{ "/additional-plugins/" | relative_url }}) pages. ## Recipes Recipes are plugin templates that are created by the Talk team and 3rd party developers, in order to help contributors and newsrooms build plugins easily. -You can explore the recipes we offer by vising our [Plugin Recipes]({{ "/plugin-recipes/" | relative_url}}) +You can explore the recipes we offer by visiting our [Plugin Recipes]({{ "/plugin-recipes/" | relative_url}}) page. diff --git a/docs/_docs/04-02-product-guide-trust.md b/docs/_docs/04-02-product-guide-trust.md index e0dd90182..42587d203 100644 --- a/docs/_docs/04-02-product-guide-trust.md +++ b/docs/_docs/04-02-product-guide-trust.md @@ -4,7 +4,7 @@ permalink: /trust/ --- Trust is a set of components within Talk that incorporate automated moderation -behaviors based on a user interactions. +features based on a user's previous behavior. ### User Karma Score @@ -28,7 +28,7 @@ Here are the default thresholds: +3 and higher: Reliable ``` -You can configure your own Trust thresholds by using [TRUST_THRESHOLD]({{"/advanced-configuration/#trust_thresholds" | relative_url }}{:.param} in your +You can configure your own Trust thresholds by using [TRUST_THRESHOLD]({{"/advanced-configuration/#trust_thresholds" | relative_url }}{:.param}) in your configuration. diff --git a/docs/_docs/04-03-product-guide-toxic-comments.md b/docs/_docs/04-03-product-guide-toxic-comments.md index f3dd506ba..56677a421 100644 --- a/docs/_docs/04-03-product-guide-toxic-comments.md +++ b/docs/_docs/04-03-product-guide-toxic-comments.md @@ -21,11 +21,7 @@ Talk (0.8 or 80% is the default), which works like this: Read more about Coral’s take on toxicity [on our blog](https://blog.coralproject.net/toxic-avenging/){:target="_blank"}. -To enable this behavior, visit the -[talk-plugin-toxic-comments]({{ "/additional-plugins/#talk-plugin-toxic-comments" | relative_url }}) -plugin documentation. - -## What is the Perspective API? +### What is the Perspective API? The likely toxicity of a comment is evaluated using scores generated from [Perspective API](http://perspectiveapi.com/){:target="_blank"}. This is part of @@ -50,4 +46,14 @@ their work available for others, including us, to use. We’ve talked with their team on several occasions, and have been impressed by their dedication and commitment to this issue. These are smart people who are -trying to improve a broken part of the internet. \ No newline at end of file +trying to improve a broken part of the internet. + +### How do I add the Toxic Comments plugin? +To enable this behavior, visit the +[talk-plugin-toxic-comments]({{ "/additional-plugins/#talk-plugin-toxic-comments" | relative_url }}) +plugin documentation. + + +### Request an API Key + +You can read more about Google's Perspective API and/or request an API key here: [http://perspectiveapi.com/](http://perspectiveapi.com/). diff --git a/docs/_sass/talk.scss b/docs/_sass/talk.scss index 7597275c3..85e5f1c93 100644 --- a/docs/_sass/talk.scss +++ b/docs/_sass/talk.scss @@ -231,10 +231,9 @@ pre { } .coral-link { - border-bottom: 2px dotted $coral_button_border_color; + border-bottom: 1px solid $coral_button_border_color; color: $coral_button_color; text-decoration: none; - font-weight: bold; &:hover { color: $coral_button_hover_color; From a7064bbfdbf0fbf5ad708df3ef1cf5b068e7a8b6 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 12 Oct 2017 10:29:23 -0300 Subject: [PATCH 18/19] Adding missing proptypes and ellipsis --- .../src/routes/Community/components/People.js | 9 +++++++++ .../src/routes/Community/components/Table.css | 7 +++++++ .../src/routes/Community/components/Table.js | 17 +++++++++++++++-- .../src/routes/Community/containers/Table.js | 12 ++++++++---- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/client/coral-admin/src/routes/Community/components/People.js b/client/coral-admin/src/routes/Community/components/People.js index ff1c2c279..b0524f273 100644 --- a/client/coral-admin/src/routes/Community/components/People.js +++ b/client/coral-admin/src/routes/Community/components/People.js @@ -5,6 +5,7 @@ import Table from '../containers/Table'; import {Pager, Icon} from 'coral-ui'; import EmptyCard from '../../../components/EmptyCard'; import t from 'coral-framework/services/i18n'; +import PropTypes from 'prop-types'; const tableHeaders = [ { @@ -62,4 +63,12 @@ const People = ({commenters, searchValue, onSearchChange, ...props}) => { ); }; +People.propTypes = { + commenters: PropTypes.array, + searchValue: PropTypes.string, + onSearchChange: PropTypes.func, + totalPages: PropTypes.number, + onNewPageHandler: PropTypes.func, +}; + export default People; diff --git a/client/coral-admin/src/routes/Community/components/Table.css b/client/coral-admin/src/routes/Community/components/Table.css index affc6c0e2..65eda5b4c 100644 --- a/client/coral-admin/src/routes/Community/components/Table.css +++ b/client/coral-admin/src/routes/Community/components/Table.css @@ -19,6 +19,13 @@ } } +.username, .email { + max-width: 215px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + .email { display: block; } diff --git a/client/coral-admin/src/routes/Community/components/Table.js b/client/coral-admin/src/routes/Community/components/Table.js index 18f52592d..60621080e 100644 --- a/client/coral-admin/src/routes/Community/components/Table.js +++ b/client/coral-admin/src/routes/Community/components/Table.js @@ -2,8 +2,10 @@ import React from 'react'; import {SelectField, Option} from 'react-mdl-selectfield'; import styles from '../components/Table.css'; import t from 'coral-framework/services/i18n'; +import PropTypes from 'prop-types'; +import cn from 'classnames'; -export default ({headers, commenters, onHeaderClickHandler, onRoleChange, onCommenterStatusChange, viewUserDetail}) => ( +const Table = ({headers, commenters, onHeaderClickHandler, onRoleChange, onCommenterStatusChange, viewUserDetail}) => ( @@ -21,7 +23,7 @@ export default ({headers, commenters, onHeaderClickHandler, onRoleChange, onComm {commenters.map((row, i)=> (
- + {row.profiles.map(({id}) => id)} @@ -54,3 +56,14 @@ export default ({headers, commenters, onHeaderClickHandler, onRoleChange, onComm
); + +Table.propTypes = { + headers: PropTypes.array, + commenters: PropTypes.array, + onHeaderClickHandler: PropTypes.func, + onRoleChange: PropTypes.func, + onCommenterStatusChange: PropTypes.func, + viewUserDetail: PropTypes.func, +}; + +export default Table; diff --git a/client/coral-admin/src/routes/Community/containers/Table.js b/client/coral-admin/src/routes/Community/containers/Table.js index 5d4e4914f..086a56638 100644 --- a/client/coral-admin/src/routes/Community/containers/Table.js +++ b/client/coral-admin/src/routes/Community/containers/Table.js @@ -1,10 +1,10 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; import {setRole, setCommenterStatus} from '../../../actions/community'; import Table from '../components/Table'; import {viewUserDetail} from '../../../actions/userDetail'; +import PropTypes from 'prop-types'; class TableContainer extends Component { @@ -22,6 +22,12 @@ class TableContainer extends Component { } } +TableContainer.propTypes = { + setRole: PropTypes.func, + setCommenterStatus: PropTypes.func, + commenters: PropTypes.array, +}; + const mapStateToProps = (state) => ({ commenters: state.community.accounts, }); @@ -33,7 +39,5 @@ const mapDispatchToProps = (dispatch) => viewUserDetail, }, dispatch); -export default compose( - connect(mapStateToProps, mapDispatchToProps), -)(TableContainer); +export default connect(mapStateToProps, mapDispatchToProps)(TableContainer); From 3035ba0bcfa7ac877aa2bdd43d76dd601fa70b4b Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 12 Oct 2017 20:57:34 +0700 Subject: [PATCH 19/19] Fix configure styling issues --- .../coral-admin/src/routes/Configure/components/Configure.css | 2 +- client/coral-framework/components/ConfigureCard.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/coral-admin/src/routes/Configure/components/Configure.css b/client/coral-admin/src/routes/Configure/components/Configure.css index 33a0c9c6f..82760acff 100644 --- a/client/coral-admin/src/routes/Configure/components/Configure.css +++ b/client/coral-admin/src/routes/Configure/components/Configure.css @@ -20,7 +20,7 @@ .mainContent { width: calc(100% - 300px); - padding: 10px 14px; + padding: 10px 14px 80px 14px; box-sizing: border-box; max-width: 718px; } diff --git a/client/coral-framework/components/ConfigureCard.css b/client/coral-framework/components/ConfigureCard.css index 0aafcf7f4..f72ea0c73 100644 --- a/client/coral-framework/components/ConfigureCard.css +++ b/client/coral-framework/components/ConfigureCard.css @@ -3,6 +3,7 @@ align-items: flex-start; min-height: 100px; max-width: 600px; + overflow: visible; } .header {