Compare commits

..
914 Commits
Author SHA1 Message Date
Wyatt Johnson 87ffa45050 Merge pull request #1525 from coralproject/storage-fixes
Storage Fixes
2018-04-12 13:50:08 -06:00
Wyatt Johnson 4a4357bc4c version bump 2018-04-12 13:37:42 -06:00
Wyatt Johnson bb11de562f Removed storage check 2018-04-12 13:24:56 -06:00
Wyatt Johnson 5125bb5d2d logic cleanup 2018-04-12 13:22:20 -06:00
Wyatt Johnson 1c87181b17 cleanups around storageAccess 2018-04-12 12:58:30 -06:00
Wyatt Johnson 142f463211 Storage Fixes
- Implements storage fixes (fixes #1520)
- Implements updates to locale
2018-04-12 12:47:09 -06:00
Wyatt Johnson 96733ade4d Merge pull request #1518 from coralproject/ignored-users-reply
Ignored User Reply Notifications
2018-04-12 11:04:49 -06:00
Wyatt Johnson 9598e6d426 Merge branch 'master' into ignored-users-reply 2018-04-12 10:54:00 -06:00
Wyatt Johnson 91c4197fd7 Merge pull request #1512 from coralproject/autocomplete-off
Disable autocomplete on username signup field
2018-04-12 10:53:48 -06:00
Wyatt Johnson 8042083f6c Merge branch 'master' into autocomplete-off 2018-04-12 10:46:04 -06:00
Belén Curcio 8232ae3e76 Merge branch 'master' into ignored-users-reply 2018-04-12 13:45:32 -03:00
okbel 4e63cff57f Merge branch 'autocomplete-off' of github.com:coralproject/talk into autocomplete-off
* 'autocomplete-off' of github.com:coralproject/talk:
  updated version
  FrenchCorrections
  New version of the translation
  added missing translations
  add missing strings in fr locale
  Add Finnish translation
2018-04-12 12:18:53 -03:00
okbel 0206804bf4 autocapitalize off for the username field 2018-04-12 12:18:22 -03:00
Wyatt Johnson 270c070075 Merge pull request #1521 from coralproject/perm-update
Permission Updates
2018-04-11 16:06:45 -06:00
Wyatt Johnson dc0c3b4a67 Authors cannot see their own status history 2018-04-11 15:58:04 -06:00
Wyatt Johnson b51bb7486e Permission Updates
- Restrict status history to ADMIN/MODERATORS
- Restrict body history to ADMIN/MODERATORS
2018-04-11 15:56:03 -06:00
Wyatt Johnson 7f9503d6aa Merge pull request #1519 from losowsky/master
Add 'User Roles' piece to the docs
2018-04-11 14:19:46 -06:00
Andrew Losowsky f81e973315 Added User Roles to the menu 2018-04-11 15:50:42 -04:00
Andrew Losowsky 1dc3b855aa Bullets replaced with asterisks per markdown 2018-04-11 14:33:30 -04:00
Andrew Losowsky aef5076ac1 Update 03-04-user-roles.md 2018-04-11 14:31:50 -04:00
Andrew Losowsky 2294286483 Rename 03-03-user-roles.md to 03-04-user-roles.md 2018-04-11 14:30:42 -04:00
Andrew Losowsky 6b7580acaf Create 03-03-user-roles.md 2018-04-11 14:30:27 -04:00
Andrew Losowsky b2dc178fdb Rename 03-06-product-guide-trust.md to 03-07-product-guide-trust.md 2018-04-11 14:19:02 -04:00
Andrew Losowsky dd916a3ef9 Rename 03-05-product-guide-trust.md to 03-06-product-guide-trust.md 2018-04-11 14:18:43 -04:00
Andrew Losowsky 4eff55a0d1 Rename 03-04-product-guide-trust.md to 03-05-product-guide-trust.md 2018-04-11 14:18:25 -04:00
Wyatt Johnson e77243536c Merge pull request #1516 from coralproject/coral-docs
Removed unused coral-docs
2018-04-11 11:33:33 -06:00
Wyatt Johnson 97a8a6dadd Merge branch 'master' into coral-docs 2018-04-11 11:22:52 -06:00
Wyatt Johnson 05c0998541 Merge pull request #1517 from coralproject/errors
Refactored Errors
2018-04-11 11:22:39 -06:00
Wyatt Johnson 18570a97ea Merge branch 'master' into errors 2018-04-11 11:14:15 -06:00
Wyatt Johnson 28e264868a Merge pull request #1513 from coralproject/logging
Logging Improvements
2018-04-11 11:11:45 -06:00
Wyatt Johnson 4dfc90cac4 Merge branch 'master' into autocomplete-off 2018-04-11 11:09:52 -06:00
Belén Curcio 7b4829bfac Merge branch 'master' into logging 2018-04-11 13:00:43 -03:00
Wyatt Johnson 2e74f79b79 Ignored User Reply Notifications 2018-04-10 17:33:56 -06:00
Wyatt Johnson f1b8d71cba Refactored Errors 2018-04-10 16:51:07 -06:00
Wyatt Johnson edfe60b8e0 removed unused coral-docs 2018-04-10 15:52:10 -06:00
Wyatt Johnson 46078117c8 updated version 2018-04-10 12:05:59 -06:00
Wyatt Johnson 879820d340 Merge pull request #1515 from cecilebertin/MissingFrench
Missing french translations
2018-04-10 11:13:51 -06:00
Wyatt Johnson 88d9cd193b Merge branch 'master' into MissingFrench 2018-04-10 10:57:30 -06:00
Wyatt Johnson 624d768f38 Merge pull request #1511 from almamedia/master
Finnish translation
2018-04-10 10:57:05 -06:00
cecile 254033a294 FrenchCorrections 2018-04-10 09:40:22 -07:00
Wyatt Johnson 637630b8dd Merge branch 'master' into master 2018-04-10 10:27:59 -06:00
Ville Kauppi 80987a1e46 New version of the translation 2018-04-10 13:21:52 +03:00
cecile e9e70f7e75 added missing translations 2018-04-09 21:20:23 -07:00
cecile ffde113a74 add missing strings in fr locale 2018-04-09 17:53:07 -07:00
Wyatt Johnson e358dce594 improved support 2018-04-09 13:59:23 -06:00
okbel 3fcad35492 autocomplete off 2018-04-09 16:27:02 -03:00
Wyatt Johnson 4694f986c0 Logging Improvements
- development logging prints pretty again
- http requests are logged using bunyan now
2018-04-09 13:22:02 -06:00
Wyatt Johnson aef096fa4c Merge pull request #1510 from coralproject/asset-scrape-fix
Asset Scraping CLI Fix
2018-04-09 09:10:58 -06:00
Ville Kauppi a6518b183f Add Finnish translation 2018-04-08 15:05:49 +03:00
Wyatt Johnson 93ccec6614 Fixes #1505 2018-04-06 16:19:10 -06:00
Wyatt Johnson 691e0f5256 Merge pull request #1492 from coralproject/docs
Docs cleanup
2018-04-06 16:08:14 -06:00
Wyatt Johnson 0e1ace115e Merge branch 'master' into docs 2018-04-06 15:24:17 -06:00
Wyatt Johnson ae361d5110 Merge pull request #1509 from coralproject/safari-auth
Safari External Auth
2018-04-06 15:24:05 -06:00
Belén Curcio cfe5b12abd Merge branch 'master' into safari-auth 2018-04-06 17:56:30 -03:00
Wyatt Johnson 1e2c224204 Merge branch 'master' into docs 2018-04-06 13:52:06 -06:00
Wyatt Johnson fbe2ec30aa Merge pull request #1498 from coralproject/#156312019
Admin Settings: Save and discard changes / Routes
2018-04-06 13:37:39 -06:00
Belén Curcio 2f7f6f4f53 Merge branch 'master' into #156312019 2018-04-05 17:27:44 -03:00
okbel f77493afb1 Merge branch '#156312019' of github.com:coralproject/talk into #156312019
* '#156312019' of github.com:coralproject/talk:
  IfSlotIsNotEmpty Bug
  allow plugin code from clients to be parsed by webpack
  Restore Links
  fix install buttons - making the click area bigger
  Scraper improvements
2018-04-05 17:25:30 -03:00
okbel 793b473681 PropTypes 2018-04-05 17:25:00 -03:00
okbel ad56d3b99a Removin actions, using routes, and continuing the transition when the user makes an action 2018-04-05 17:24:11 -03:00
Wyatt Johnson e6b8cd3220 fixes related to external auth 2018-04-05 14:19:11 -06:00
Wyatt Johnson 98725fcb19 Merge pull request #1506 from coralproject/slot-bug
Slot Bug - commentContent should only render one plugin
2018-04-05 11:38:35 -06:00
Wyatt Johnson ee163af833 Merge branch 'master' into slot-bug 2018-04-05 11:19:59 -06:00
Wyatt Johnson 8ec933e844 Merge branch 'master' into #156312019 2018-04-04 09:32:48 -06:00
Wyatt Johnson 13f81ad819 Merge pull request #1500 from coralproject/restore-links
Restore Links of old comments when using RTE
2018-04-04 09:32:26 -06:00
Wyatt Johnson 8d185fe309 Merge branch 'master' into restore-links 2018-04-04 09:24:29 -06:00
okbel edbe49618a Adding size, and proptypes 2018-04-03 20:17:31 -03:00
Wyatt Johnson 2ec7b53cea Merge pull request #1503 from coralproject/if-slot-not-empty
IfSlotIsNotEmpty Bug
2018-04-03 13:04:15 -06:00
okbel c448d8d2cd Merge branch '#156312019' of github.com:coralproject/talk into #156312019
* '#156312019' of github.com:coralproject/talk:
  Removing plugin
  Removing plugin
  renaming slot :D
  renaming
  Remaining rename
  Give descriptive key for slot elements and use it instead of talkPluginName
  Styling
  adding it back
  re entering
  Ignoring
  with hasBlockers
  changes
  Styling and translations
  Adding checkbox, working on the translations
  wip
  Working on containers
  Removing styles from sign in
2018-04-03 10:23:12 -03:00
Wyatt Johnson fb3233cf01 IfSlotIsNotEmpty Bug 2018-04-02 17:01:49 -06:00
Kim Gardner 30c38fa696 Merge branch 'master' into restore-links 2018-04-02 18:25:34 -04:00
okbel e4358ac3a1 Style and translations 2018-04-02 16:09:47 -03:00
Wyatt Johnson de6f325204 Merge pull request #1502 from coralproject/webpack-plugins
Webpack and client plugins
2018-04-02 12:55:45 -06:00
Wyatt Johnson 13667deaed Merge branch 'master' into webpack-plugins 2018-04-02 12:44:56 -06:00
Kim Gardner 610bf36947 Merge branch 'master' into restore-links 2018-04-02 14:44:01 -04:00
Kim Gardner 126d55e6d8 Merge pull request #1494 from coralproject/fix-install
Fix install buttons
2018-04-02 14:43:27 -04:00
Wyatt Johnson 6f0af18619 Merge branch 'master' into webpack-plugins 2018-04-02 12:27:41 -06:00
Wyatt Johnson 3da201c22d allow plugin code from clients to be parsed by webpack 2018-04-02 12:25:18 -06:00
Kim Gardner 5ae9d719f3 Merge branch 'master' into fix-install 2018-04-02 13:43:42 -04:00
Kim Gardner 91bce6c74a Merge pull request #1481 from coralproject/scraper
Scraper improvements
2018-04-02 13:43:33 -04:00
Kim Gardner 232ed4f4ef Merge branch 'master' into restore-links 2018-04-02 13:42:32 -04:00
Belén Curcio 7720f1d178 Merge branch 'master' into #156312019 2018-04-02 14:38:21 -03:00
Kim Gardner 533cd3217d Merge branch 'master' into fix-install 2018-04-02 13:37:12 -04:00
okbel d16ce17e36 SaveChangesDialog 2018-04-02 14:35:09 -03:00
Kim Gardner e8026afb41 Merge branch 'master' into scraper 2018-04-02 13:34:24 -04:00
okbel 81509b660e Spanish translations 2018-04-02 14:19:25 -03:00
okbel 4ed04d1c39 Adding translations 2018-04-02 14:12:02 -03:00
okbel 17e90b0313 Merge branch '#156312019' of github.com:coralproject/talk into #156312019
* '#156312019' of github.com:coralproject/talk:
  Add back missing tutorial
2018-04-02 13:50:06 -03:00
okbel a509405f43 alert route hook ready! 2018-04-02 13:33:50 -03:00
Kim Gardner 3d61713f16 Merge pull request #1484 from coralproject/terms-and-conditions
Terms and conditions
2018-04-02 12:17:11 -04:00
Belén Curcio 56987bdcd6 Merge branch 'master' into #156312019 2018-04-02 12:50:47 -03:00
okbel 24c1abaa06 Removing plugin 2018-03-30 16:05:25 -03:00
Chi Vinh Le fe75d9543c Restore Links 2018-03-30 20:12:10 +02:00
okbel 681f9ecf5a Removing plugin 2018-03-30 14:39:16 -03:00
okbel 394ebb8f2d Save changes / discard changes dialohg 2018-03-30 12:18:57 -03:00
okbel 6982509233 router and state lifted 2018-03-30 12:00:50 -03:00
okbel 06b64ad250 routes 2018-03-30 10:55:15 -03:00
okbel 9cc089b3b2 renaming slot :D 2018-03-30 10:37:42 -03:00
okbel ae674a4e62 Merge branch 'terms-and-conditions' of github.com:coralproject/talk into terms-and-conditions
* 'terms-and-conditions' of github.com:coralproject/talk: (136 commits)
  Remaining rename
  Give descriptive key for slot elements and use it instead of talkPluginName
  Add back missing tutorial
  removed unused plugin from directory
  expanded fix to staff replies
  Fix notification responsiveness
  Profile my comments responsive fixes
  Notification fixes
  Remove italic styling from blockquote
  Better disabled detection
  Disable hover on touch devices
  docs update
  Let browser insert text
  Support nested feature instance
  Rename buttons to feature
  Add classNames for styling
  Shortcut support
  Fix append new line after node..
  Better selection behavior
  Remove all unwanted style attr
  ...
2018-03-30 10:36:33 -03:00
okbel ec117a67aa renaming 2018-03-30 10:35:49 -03:00
Chi Vinh Le f32c9fa6b1 Remaining rename 2018-03-29 22:51:40 +02:00
Chi Vinh Le 761e372016 Give descriptive key for slot elements and use it instead of talkPluginName 2018-03-29 22:47:27 +02:00
okbel 8d147c9e7b Styling 2018-03-29 13:27:35 -03:00
Belén Curcio 4a4c502fdd Merge branch 'master' into terms-and-conditions 2018-03-29 11:20:01 -03:00
okbel bfea8b00e1 adding it back 2018-03-29 11:18:29 -03:00
okbel 94dbfd6802 re entering 2018-03-29 11:15:48 -03:00
okbel c5dc8454a2 Ignoring 2018-03-29 11:15:34 -03:00
okbel ff9a212cfb with hasBlockers 2018-03-29 11:10:22 -03:00
okbel 0b3b252fc3 changes 2018-03-29 10:56:18 -03:00
Kim Gardner 6f616a1e78 Merge branch 'master' into scraper 2018-03-28 09:18:11 -04:00
Belén Curcio 3a436bd530 Merge branch 'master' into fix-install 2018-03-28 10:17:53 -03:00
Kim Gardner cb7b4133f9 Merge pull request #1495 from coralproject/add-missing-tutorial
Add back missing tutorial
2018-03-28 09:04:19 -04:00
Kim Gardner 217c2f1bfa Add back missing tutorial 2018-03-28 08:55:55 -04:00
okbel bad72e0ef4 fix install buttons - making the click area bigger 2018-03-28 09:27:50 -03:00
Wyatt Johnson cf0551d3e7 Docs cleanup
- Removed references to Facebook being a default plugin
2018-03-27 14:10:53 -06:00
Wyatt Johnson f83aea0431 Merge pull request #1490 from coralproject/docs
Plugin Docs Update
2018-03-27 13:03:09 -06:00
Wyatt Johnson c2133eb009 removed unused plugin from directory 2018-03-27 12:55:43 -06:00
Wyatt Johnson 20187ad365 Merge pull request #1489 from coralproject/responsive-fixes
Responsive fixes
2018-03-26 16:54:10 -06:00
Wyatt Johnson 02326cd3a7 Merge branch 'master' into responsive-fixes 2018-03-26 16:45:42 -06:00
Wyatt Johnson 6fe453415d Merge pull request #1486 from coralproject/docs
Docs Link Fixes
2018-03-26 16:45:33 -06:00
Wyatt Johnson 05b29f2f06 Merge branch 'master' into docs 2018-03-26 16:29:27 -06:00
Wyatt Johnson 28afcdd007 Merge pull request #1488 from coralproject/notification-fixes
Notification fixes
2018-03-26 16:29:19 -06:00
Wyatt Johnson a128c7cb76 Merge branch 'master' into responsive-fixes 2018-03-26 16:27:13 -06:00
Wyatt Johnson cf61ca0485 Merge branch 'master' into docs 2018-03-26 16:26:57 -06:00
Wyatt Johnson 7c9fd2acb3 Merge branch 'master' into notification-fixes 2018-03-26 16:14:22 -06:00
Wyatt Johnson 7e5ff7bf96 Merge pull request #1487 from coralproject/rte-fixes2
RTE Bug Fixes
2018-03-26 16:12:22 -06:00
Wyatt Johnson 34e3266a6f expanded fix to staff replies 2018-03-26 16:06:40 -06:00
Chi Vinh Le bc11eaa9c8 Fix notification responsiveness 2018-03-26 23:11:14 +02:00
Chi Vinh Le 969d2a1588 Profile my comments responsive fixes 2018-03-26 23:07:05 +02:00
Wyatt Johnson cd412056ad Notification fixes
- When a comment reply is not visible, it will not trigger a
notification email.
- When a comment is approved/accepted, we'll check to see if the comment
was visible before, if not, we'll delegate to the new reply notification
handler to possibly send a notification email.
2018-03-26 15:01:55 -06:00
Chi Vinh Le 0865c4d5ad Remove italic styling from blockquote 2018-03-26 22:56:26 +02:00
Chi Vinh Le dca9b19240 Better disabled detection 2018-03-26 22:44:24 +02:00
Chi Vinh Le 5b9d24a029 Disable hover on touch devices 2018-03-26 22:35:21 +02:00
Jeff Nelson b646320b92 Merge branch 'master' into docs 2018-03-26 15:31:16 -04:00
Wyatt Johnson 864012e5ab Merge pull request #1475 from coralproject/rte-fixes
RTE fixes and improvements
2018-03-26 13:06:56 -06:00
Wyatt Johnson e86cfaaa5b docs update 2018-03-26 12:52:04 -06:00
Wyatt Johnson 93d6ad9e55 Merge branch 'master' into scraper 2018-03-26 09:29:52 -06:00
okbel f8fbedd727 Styling and translations 2018-03-26 12:06:38 -03:00
okbel 2cf047a393 Adding checkbox, working on the translations 2018-03-26 11:36:10 -03:00
Chi Vinh Le 45ad7eeff7 Let browser insert text 2018-03-25 23:17:47 +02:00
Kiwi 7437595002 Merge branch 'master' into rte-fixes 2018-03-25 23:02:39 +02:00
Chi Vinh Le 9efa5479a8 Support nested feature instance 2018-03-25 23:01:43 +02:00
Chi Vinh Le 7867b0113e Rename buttons to feature 2018-03-25 22:52:48 +02:00
Chi Vinh Le 17d50c6ebb Add classNames for styling 2018-03-25 22:48:51 +02:00
Chi Vinh Le 11051fbdb9 Shortcut support 2018-03-25 22:43:30 +02:00
Chi Vinh Le ee9786de02 Fix append new line after node.. 2018-03-25 22:18:57 +02:00
Chi Vinh Le 0226991521 Better selection behavior 2018-03-25 22:07:32 +02:00
Chi Vinh Le 7d4217d2d7 Remove all unwanted style attr 2018-03-25 21:41:45 +02:00
Chi Vinh Le 81b98187f1 Ensure end in new line blockquote 2018-03-25 18:44:46 +02:00
Chi Vinh Le a7e580fab3 Fix paste for ie 2018-03-25 18:38:49 +02:00
Chi Vinh Le a55cee5cc1 IE Fixes 2018-03-25 17:50:29 +02:00
Chi Vinh Le 69e194f648 Unmount cleanly 2018-03-25 01:58:35 +01:00
Chi Vinh Le 939df89842 Simplify normalizer, adjust server config 2018-03-25 01:37:45 +01:00
Chi Vinh Le 8586da97fb Add limitTo 2018-03-25 01:32:21 +01:00
Chi Vinh Le 2757791672 Refactor 2018-03-25 01:20:46 +01:00
Chi Vinh Le 06ed792005 Add comments 2018-03-25 00:02:42 +01:00
Chi Vinh Le 3bd8d5627b Use our own UNDO stack!! 2018-03-24 21:43:32 +01:00
Chi Vinh Le 595dda11bf Control pasting, better IE support 2018-03-24 19:14:06 +01:00
Chi Vinh Le a154ccfc60 Better dom handling, disable state 2018-03-24 15:36:49 +01:00
Chi Vinh Le cc66be033a More manual DOM manipulations 2018-03-24 02:45:31 +01:00
Kim Gardner 0b624927b5 Merge pull request #1482 from coralproject/introspection-fix
Introspection fix
2018-03-23 18:31:04 -04:00
Kim Gardner 92ce39bfa8 Merge branch 'master' into introspection-fix 2018-03-23 18:19:13 -04:00
Kim Gardner 4ee9ce00f2 Merge pull request #1483 from coralproject/email-subject-docs
Email Subject Docs
2018-03-23 18:19:06 -04:00
Kim Gardner 0a02eda343 Merge branch 'master' into introspection-fix 2018-03-23 18:14:37 -04:00
Wyatt Johnson 84ddede7d3 Email Subject Docs
- Addresses missing details around how subjects are set
2018-03-23 16:12:57 -06:00
Wyatt Johnson f9ca66d165 Merge branch 'master' into scraper 2018-03-23 16:02:42 -06:00
Wyatt Johnson 82d520da0c fixed introspection bug 2018-03-23 16:01:10 -06:00
Wyatt Johnson 45b570e163 Scraper improvements
- added support for changing the scraper headers
- added a Coral-Talk/${version} user agent header by default
2018-03-23 16:00:09 -06:00
Kim Gardner bba52b4bbd Merge pull request #1470 from coralproject/bump-version-4-3-0
Update version to 4.3.0
2018-03-23 17:59:26 -04:00
Kim Gardner 896b12a7b7 Merge branch 'master' into bump-version-4-3-0 2018-03-23 17:42:27 -04:00
Kim Gardner 3df1bed645 Merge pull request #1464 from coralproject/docs-plug
Docs for the Plugins API
2018-03-23 17:42:01 -04:00
Kim Gardner 6ca7f3b53e Merge branch 'master' into docs-plug 2018-03-23 17:21:34 -04:00
Kim Gardner beb301cf22 Merge pull request #1474 from coralproject/party-bugsa
Bug fixes
2018-03-23 17:20:49 -04:00
Kim Gardner 999a0710f5 Merge branch 'master' into party-bugsa 2018-03-23 17:10:21 -04:00
Kim Gardner 3a92aa33a9 Merge pull request #1478 from mkonikov/patch-4
Clarifying importance of order in plugins.json
2018-03-23 17:10:14 -04:00
Kim Gardner 7a505ac5fc Tweak on tutorial 2018-03-23 17:08:41 -04:00
Kim Gardner be75980edb Merge branch 'master' into docs-plug 2018-03-23 17:05:35 -04:00
okbel ab96417d3d wip 2018-03-23 17:27:23 -03:00
Kim Gardner 8a5118728b Merge branch 'master' into patch-4 2018-03-23 16:10:35 -04:00
Kim Gardner e39e0b7875 Merge pull request #1476 from coralproject/losowsky-patch-1
Create 'when you've installed talk' tutorial
2018-03-23 16:10:13 -04:00
Kim Gardner d5df9ba8e4 Merge branch 'losowsky-patch-1' of git+ssh://github.com/coralproject/talk into losowsky-patch-1 2018-03-23 16:04:45 -04:00
Kim Gardner e67aea48af Merge branch 'master' of git+ssh://github.com/coralproject/talk into losowsky-patch-1 2018-03-23 16:04:28 -04:00
okbel 935ba6e9fe Merge branch 'party-bugsa' of github.com:coralproject/talk into party-bugsa
* 'party-bugsa' of github.com:coralproject/talk:
  Fixed up clean script
  Moved loadable to the markdown editor
  swapped manual dynamic chunked loader with readt-loadable
  improved static template resolve in development
  improved introspection
2018-03-23 16:54:13 -03:00
okbel 4881c33942 Calc added 2018-03-23 16:52:38 -03:00
Kim Gardner e89b5da864 Merge branch 'master' into docs-plug 2018-03-23 15:10:38 -04:00
Wyatt Johnson d80a2d84c5 Merge branch 'master' into patch-4 2018-03-23 13:08:18 -06:00
okbel 2fe17d29e3 Working on containers 2018-03-23 16:03:33 -03:00
okbel a53194b4a0 Removing styles from sign in 2018-03-23 15:51:04 -03:00
Kim Gardner c9e5fd99b5 Merge branch 'master' into losowsky-patch-1 2018-03-23 14:02:30 -04:00
Kim Gardner cd4d666a46 More tweaks to formatting 2018-03-23 14:02:03 -04:00
Kim Gardner ab476f93b6 More formatting 2018-03-23 13:56:43 -04:00
Kim Gardner c5536da565 Formatting updates and add to sidebar 2018-03-23 13:55:34 -04:00
Kim Gardner 1b233e8cb6 Merge branch 'master' into party-bugsa 2018-03-23 13:54:52 -04:00
Kim Gardner 2599000e60 Merge pull request #1479 from coralproject/mdeditor
Markdown Editor Fixes
2018-03-23 13:54:15 -04:00
Wyatt Johnson 8a3cbac442 Fixed up clean script 2018-03-23 11:45:38 -06:00
okbel 5e259af72b Merge branch 'master' of github.com:coralproject/talk into party-bugsa
* 'master' of github.com:coralproject/talk:
  Verification link copy
2018-03-23 14:17:46 -03:00
Wyatt Johnson d7cf733a42 Moved loadable to the markdown editor 2018-03-23 11:15:47 -06:00
Mendel Konikov f69163d9c2 Clarifying importance of order in plugins.json 2018-03-23 09:21:31 -04:00
Chi Vinh Le 246e3efe7f Include translations 2018-03-23 12:49:08 +01:00
Chi Vinh Le b504d2ad2b Translations 2018-03-23 12:41:08 +01:00
Chi Vinh Le de48880e01 Refactor n active state 2018-03-23 12:37:20 +01:00
Andrew Losowsky 8f727cc6db Create 'when you've installed talk' tutorial 2018-03-22 19:47:29 -04:00
Wyatt Johnson 59982d4329 swapped manual dynamic chunked loader with readt-loadable 2018-03-22 17:29:38 -06:00
Wyatt Johnson 4f87c88e04 improved static template resolve in development 2018-03-22 17:29:07 -06:00
Wyatt Johnson 3ec7bf09bf improved introspection 2018-03-22 17:28:44 -06:00
Chi Vinh Le 1fb1fc6ba9 Add comments 2018-03-23 00:02:27 +01:00
Chi Vinh Le 543dde12aa Remove unused 2018-03-22 23:59:35 +01:00
Kim Gardner ef11a27e1d Merge branch 'master' into docs-plug 2018-03-22 18:35:42 -04:00
Kim Gardner 752c16f513 Move Plugin Client and Slots docs to API section 2018-03-22 18:35:14 -04:00
Chi Vinh Le a1fcb6e171 Make bold more bold 2018-03-22 23:27:36 +01:00
Chi Vinh Le d4e02b620e Typo 2018-03-22 23:19:50 +01:00
Chi Vinh Le 292e33c105 Implement AdminCommentContent for text and html 2018-03-22 23:15:21 +01:00
Belén Curcio e66a2eb8e0 Merge branch 'master' into party-bugsa 2018-03-22 16:27:17 -03:00
okbel 61836423ac Adding CommentNotFound Component 2018-03-22 16:21:13 -03:00
Kim Gardner 6844960300 Merge pull request #1473 from coralproject/email-verification
Email Verification Copy
2018-03-22 15:16:01 -04:00
Wyatt Johnson 34fa2fb891 Verification link copy 2018-03-22 12:50:37 -06:00
Chi Vinh Le a1a867ec55 Add margin to contentEditable 2018-03-22 19:44:53 +01:00
okbel b0ea4960e3 Working 2018-03-22 15:40:04 -03:00
okbel 36988d7e20 Forbidden component 2018-03-22 15:29:56 -03:00
Chi Vinh Le 19920deeda Better detect tag ancestors 2018-03-22 18:03:13 +01:00
okbel 64094c40db More 2018-03-22 12:38:33 -03:00
okbel 1fc7500837 More 2018-03-22 12:36:46 -03:00
okbel 773c843834 Click Outside 2018-03-22 11:59:33 -03:00
Belén Curcio a4c2b879ea Merge branch 'master' into docs-plug 2018-03-22 11:46:39 -03:00
Kim Gardner 74271853e2 Update version to 4.3.0 2018-03-21 19:16:56 -04:00
Kim Gardner b65e7a0ad9 Merge pull request #1469 from coralproject/fix-typo
Fix typos
2018-03-21 19:15:48 -04:00
Kim Gardner 678f535500 Fix typos 2018-03-21 19:08:13 -04:00
Wyatt Johnson 47a2c5a174 Merge pull request #1463 from coralproject/update-default-plugins
Update default plugins
2018-03-21 16:43:54 -06:00
Kim Gardner cb59d51a74 Merge branch 'master' into update-default-plugins 2018-03-21 18:33:08 -04:00
Wyatt Johnson b9420406ed removed rich text from defaults 2018-03-21 16:26:54 -06:00
Kim Gardner 5491ac034c Merge branch 'update-default-plugins' of git+ssh://github.com/coralproject/talk into update-default-plugins 2018-03-21 18:26:26 -04:00
Kim Gardner 3799495929 Remove rich text from default for now 2018-03-21 18:25:47 -04:00
Kim Gardner 5463959347 Merge pull request #1468 from coralproject/docs
Updated Notifications Docs
2018-03-21 18:18:36 -04:00
Wyatt Johnson eab17b4c1d Merge branch 'master' into docs 2018-03-21 16:10:12 -06:00
Wyatt Johnson ad1ea9a810 Updated Notifications Docs 2018-03-21 16:09:02 -06:00
Kim Gardner 101450273a Merge branch 'master' into docs-plug 2018-03-21 17:49:11 -04:00
Kim Gardner 5a2212846d Merge branch 'master' into update-default-plugins 2018-03-21 17:40:18 -04:00
Kim Gardner 6ee4a258ff Merge pull request #1460 from coralproject/rte-rework
Comment Drafting and Editing Refactor + Coral RTE
2018-03-21 17:39:56 -04:00
Kim Gardner 8e3395d0e8 Merge branch 'master' into rte-rework 2018-03-21 17:14:02 -04:00
Kim Gardner 5b436e3c4a Merge pull request #1453 from coralproject/hackday-upvote-downvote-ama
Upvote and Downvote
2018-03-21 17:13:48 -04:00
Kim Gardner 9185d3df43 Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-21 17:06:16 -04:00
Kim Gardner 822c605103 Merge pull request #1467 from coralproject/dep-fix
Fixed misplaced deps
2018-03-21 17:05:49 -04:00
Wyatt Johnson 273cc9927a Fixed misplaced deps 2018-03-21 14:51:05 -06:00
Kim Gardner bce56f2719 Merge branch 'master' into rte-rework 2018-03-21 16:42:54 -04:00
Kim Gardner 1928bc3819 Merge branch 'master' into update-default-plugins 2018-03-21 16:42:38 -04:00
Kim Gardner 11ca430ad9 Merge pull request #1465 from coralproject/mailer-template-fix
Mailer Template Fix
2018-03-21 16:42:26 -04:00
Kim Gardner dc8f4a1765 Merge branch 'master' into mailer-template-fix 2018-03-21 16:35:34 -04:00
Kim Gardner ec493f9a3a Merge pull request #1466 from coralproject/dep-fix
Moved extract-text-webpack-plugin from devDependencies to dependencies
2018-03-21 16:33:35 -04:00
Kim Gardner 58899293af Merge branch 'master' into rte-rework 2018-03-21 16:19:59 -04:00
Wyatt Johnson bf37ab8c78 Moved extract-text-webpack-plugin from devDependencies to dependencies 2018-03-21 14:14:04 -06:00
Wyatt Johnson 881d7abfa6 replaced fs-extra call to fs 2018-03-21 13:58:22 -06:00
Wyatt Johnson bf54959ef5 Fix for template rendering 2018-03-21 13:56:16 -06:00
Kim Gardner 937ee5ea67 Merge branch 'master' into update-default-plugins 2018-03-21 15:34:43 -04:00
Kim Gardner 5f526eb49c Merge pull request #1456 from coralproject/docs
GraphQL Docs Fixes
2018-03-21 15:34:27 -04:00
Chi Vinh Le f3b379922b Merge branch 'rte-rework' of ssh://github.com/coralproject/talk into rte-rework 2018-03-21 20:12:48 +01:00
Belén Curcio f23bdd91bf Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-21 16:12:05 -03:00
Kim Gardner 24f9afd531 Update sidebar and add title info 2018-03-21 15:06:20 -04:00
Chi Vinh Le 78eb92e3ab Fix styling on admin site 2018-03-21 19:48:33 +01:00
Belén Curcio b7ff6f004d Merge branch 'master' into docs-plug 2018-03-21 15:45:49 -03:00
okbel 95934b87a4 Adding docs for plugins api 2018-03-21 15:43:40 -03:00
Kim Gardner f4575e2075 Merge branch 'master' into docs 2018-03-21 14:40:48 -04:00
Kim Gardner 694a9bb438 Merge branch 'master' into rte-rework 2018-03-21 14:40:08 -04:00
Chi Vinh Le 1aeae553e5 Add border radius 2018-03-21 19:24:36 +01:00
Kim Gardner cc0dcc1620 Update default plugins 2018-03-21 14:12:44 -04:00
Chi Vinh Le 483c21990f Merge branch 'rte-rework' of ssh://github.com/coralproject/talk into rte-rework 2018-03-21 18:56:25 +01:00
Kim Gardner 1f0630d875 Merge pull request #1461 from coralproject/force-notification-settings
Notification Settings Pane Controls
2018-03-21 13:52:19 -04:00
Belén Curcio 44a8e6eb8f Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-21 14:46:05 -03:00
Kim Gardner 96865be27a Merge branch 'master' into force-notification-settings 2018-03-21 13:43:20 -04:00
Chi Vinh Le 99955b82f5 Blockquote styling 2018-03-21 18:41:27 +01:00
Wyatt Johnson 0b01700235 updated docs 2018-03-21 11:12:04 -06:00
Kim Gardner 92e910a53f Merge branch 'master' into rte-rework 2018-03-21 13:10:34 -04:00
Kiwi 195bc1715b Merge pull request #1452 from coralproject/context-perf
Context Performance
2018-03-21 18:07:48 +01:00
Wyatt Johnson a43c173a12 Added support for forcing the notification settings pane 2018-03-21 11:04:41 -06:00
Kiwi a3ea964c15 Merge branch 'master' into context-perf 2018-03-21 17:54:34 +01:00
Chi Vinh Le 68eddfa6bb Merge branch 'rte-rework' of ssh://github.com/coralproject/talk into rte-rework 2018-03-21 17:43:17 +01:00
Chi Vinh Le 1fa1077bb2 Fix normalizer 2018-03-21 17:35:39 +01:00
Kiwi 9c9e3bf798 Merge branch 'master' into rte-rework 2018-03-21 17:33:59 +01:00
Kim Gardner 9ba2ca9156 Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-21 12:32:18 -04:00
Kim Gardner c4aa2fc141 Merge pull request #1458 from jkutianski/patch-1
change Facebook to Google+
2018-03-21 12:32:04 -04:00
Kim Gardner d9b0071edc Merge branch 'hackday-upvote-downvote-ama' of git+ssh://github.com/coralproject/talk into hackday-upvote-downvote-ama 2018-03-21 12:30:56 -04:00
Kim Gardner 7bef612ad0 Add TODOs for when we deprecate font awesome 2018-03-21 12:30:22 -04:00
Chi Vinh Le ae4cc3ba20 Typo 2018-03-21 17:27:31 +01:00
Chi Vinh Le 973e907275 Combine readme 2018-03-21 17:24:57 +01:00
Chi Vinh Le fa3633b29a Add placeholder to Coral RTE :-) 2018-03-21 17:15:57 +01:00
Chi Vinh Le 16c5a90736 Move label, placeholder strings to DraftArea 2018-03-21 17:01:02 +01:00
Kim Gardner 26bc9fc94f Merge branch 'master' into patch-1 2018-03-21 11:58:00 -04:00
Chi Vinh Le 2e96ea0170 Port off topic tags to new api 2018-03-21 16:49:18 +01:00
Chi Vinh Le a4987f2947 Less deprecation messages 2018-03-21 16:48:28 +01:00
Chi Vinh Le 1256007eba New API for comment input tags 2018-03-21 16:46:08 +01:00
Kim Gardner 313c738b8b Merge pull request #1457 from coralproject/password-reset-fix
Password Reset Form Fix
2018-03-21 11:44:11 -04:00
Chi Vinh Le a73b93b0c3 Move label and placeholder to plugins 2018-03-21 16:04:03 +01:00
Chi Vinh Le 1ecc2a8f40 Remove rows 2018-03-21 15:46:00 +01:00
Chi Vinh Le 65778c31ff Refactor draft area api step 1 2018-03-21 15:41:27 +01:00
Chi Vinh Le f6e661090c Support preSubmit return input 2018-03-21 13:54:10 +01:00
Chi Vinh Le bd2fcf837a Move coral rte to talk-plugin-rich-text 2018-03-21 13:45:29 +01:00
Chi Vinh Le 44b5a122c5 Merge branch 'master' into coral-rte 2018-03-21 12:59:21 +01:00
Juan Pablo Kutianski b43b67e8fa change Facebook to Google+ 2018-03-20 23:10:30 -03:00
Wyatt Johnson 638043632c Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-20 16:08:29 -06:00
Wyatt Johnson 3415163cfb changed name based on review 2018-03-20 16:07:42 -06:00
Wyatt Johnson db1934e897 fixed password reset email form 2018-03-20 16:04:41 -06:00
Wyatt Johnson 076a07fba4 Merge branch 'master' into docs 2018-03-20 15:42:16 -06:00
Wyatt Johnson ff24f521be fixed graphql docs, added graphql tutorial 2018-03-20 15:39:38 -06:00
Kiwi d4cfe5034f Merge branch 'master' into context-perf 2018-03-20 21:19:39 +01:00
Kim Gardner ad418f49ba Merge pull request #1436 from coralproject/slots-debug
Upgrade for Debug Tools for Slots and Plugins
2018-03-20 16:19:09 -04:00
Kim Gardner 08978ba942 Merge branch 'slots-debug' of git+ssh://github.com/coralproject/talk into slots-debug 2018-03-20 16:09:51 -04:00
Kim Gardner baca86f5be Merge branch 'master' into slots-debug 2018-03-20 16:09:49 -04:00
Kim Gardner db64f21beb Typo 2018-03-20 16:09:33 -04:00
Kim Gardner 3ec6823a15 Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-20 15:50:23 -04:00
Kim Gardner b4e8f2212c Merge pull request #1454 from coralproject/update-readme
Update README
2018-03-20 15:50:10 -04:00
Kim Gardner 5ebfd14c84 Merge branch 'master' into update-readme 2018-03-20 15:42:24 -04:00
Kim Gardner 5285670a56 Merge pull request #1455 from coralproject/removing-pell
Removing talk-plugin-rich-text-editor-pell from core
2018-03-20 15:42:08 -04:00
Kim Gardner cf370d330d Merge branch 'master' into update-readme 2018-03-20 15:38:33 -04:00
Kim Gardner 2f9f72ccf3 Add most-liked back to gitignore oops 2018-03-20 15:14:19 -04:00
Kim Gardner cf6073e6a2 Merge branch 'hackday-upvote-downvote-ama' of git+ssh://github.com/coralproject/talk into hackday-upvote-downvote-ama 2018-03-20 15:08:16 -04:00
Kim Gardner 98b6ce066b Add package.json for each plugin 2018-03-20 15:03:12 -04:00
okbel 5cd2cce7d8 removing pell 2018-03-20 15:59:48 -03:00
Kim Gardner 025604c4cd Remove comments and example code 2018-03-20 14:53:28 -04:00
Belén Curcio 6edb5923d7 Merge branch 'master' into hackday-upvote-downvote-ama 2018-03-20 15:53:15 -03:00
Kim Gardner cd2426511c Remove dupe files 2018-03-20 14:08:23 -04:00
Kiwi 7e4feda033 Merge branch 'master' into context-perf 2018-03-20 19:07:37 +01:00
Chi Vinh Le d08aaecd12 Rerender all Slot Components when config changes 2018-03-20 19:00:19 +01:00
Chi Vinh Le d98e64d6d7 Deprecation stuff 2018-03-20 18:45:56 +01:00
Chi Vinh Le 84a79be9c1 Only use plugins_config in redux 2018-03-20 18:39:37 +01:00
Chi Vinh Le dbe80c40d7 Render when pluginsConfig changes 2018-03-20 18:25:04 +01:00
Chi Vinh Le db5eedf6a1 Merge branch 'slots-debug' of ssh://github.com/coralproject/talk into slots-debug 2018-03-20 18:09:55 +01:00
Chi Vinh Le 1e743ea29d Merge branch 'master' into slots-debug 2018-03-20 18:08:59 +01:00
Kim Gardner 8fc69b0551 Translate Slot docs into English 2018-03-20 13:06:37 -04:00
Kim Gardner 88a80c8ffa Merge branch 'slots-debug' of git+ssh://github.com/coralproject/talk into slots-debug 2018-03-20 13:05:09 -04:00
Kim Gardner b2db0bb877 English version of docs 2018-03-20 13:04:13 -04:00
okbel 6c35f02e6b changes 2018-03-20 13:50:28 -03:00
okbel b6ba59ac51 using the plugins service 2018-03-20 13:19:20 -03:00
okbel 74d065ea84 Merge branch 'slots-debug' of github.com:coralproject/talk into slots-debug
* 'slots-debug' of github.com:coralproject/talk:
  some minor fixes
  Fix css order
  Fix rainbow emoji, add name of Part 2 tutorial
  Remove unwanted emptyline
  More comments
  Little Comment
  Cache babel-loader branch wide in CI
  Cache busting
  Extract css
2018-03-20 13:12:30 -03:00
okbel cd9c260995 refactor into using config reducer 2018-03-20 13:10:42 -03:00
Kim Gardner 0242e7b124 Merge pull request #1446 from coralproject/better-graph
Improve Slot and GraphQL framework
2018-03-20 12:07:52 -04:00
Kim Gardner 4bf02d39a9 Merge branch 'master' into context-perf 2018-03-20 12:01:31 -04:00
okbel 030deb1b81 refactor into using config reducer 2018-03-20 12:09:32 -03:00
Kim Gardner 40ec1a42dc Fix link 2018-03-20 11:06:18 -04:00
Kim Gardner aa40e7033b Update README 2018-03-20 11:04:58 -04:00
okbel d6fba2d515 refactor into using config reducer 2018-03-20 11:52:44 -03:00
Kim Gardner 497225139d Adding upvote and downvote plugins and sorting plugins for each 2018-03-20 10:23:29 -04:00
Belén Curcio da285fb7e5 Merge branch 'master' into better-graph 2018-03-20 11:07:17 -03:00
Kim Gardner 17e02deecb Merge branch 'master' into slots-debug 2018-03-19 17:12:54 -04:00
Kim Gardner 55e829ca66 Merge pull request #1448 from coralproject/extract-css-n-caching
Extract CSS and Cache improvements
2018-03-19 17:12:24 -04:00
Kim Gardner 14e7dc0872 Merge branch 'master' into better-graph 2018-03-19 16:38:01 -04:00
Kim Gardner f35c870da8 Merge branch 'master' into extract-css-n-caching 2018-03-19 15:38:35 -04:00
Kim Gardner 1ce9219dc5 Merge pull request #1449 from coralproject/docs-tweaks
Fix rainbow emoji, add name of Part 2 tutorial
2018-03-19 15:37:10 -04:00
Wyatt Johnson d70d5db685 Merge branch 'master' into extract-css-n-caching 2018-03-19 13:10:28 -06:00
Wyatt Johnson 58c5026fb7 some minor fixes 2018-03-19 13:00:41 -06:00
okbel 8a2fa2432f @Deprecated plugin_config 2018-03-19 15:26:18 -03:00
okbel 8fcbd4b4c4 Merge branch 'slots-debug' of github.com:coralproject/talk into slots-debug
* 'slots-debug' of github.com:coralproject/talk:
  Asset Manager Tutorial
  fixed some missing calls to service
  fixed bug with endpoint
  Restore the userCreated event
  moved user deletion into graph
2018-03-19 15:15:23 -03:00
okbel eb331551c5 support for both 2018-03-19 15:14:48 -03:00
okbel 346a099c1b changes - ready to be tested 2018-03-19 15:10:14 -03:00
Wyatt Johnson df64c98b48 Merge branch 'master' into better-graph 2018-03-19 11:55:38 -06:00
Kim Gardner 9c6f4c2799 Merge branch 'master' into slots-debug 2018-03-19 13:54:16 -04:00
Belén Curcio 12cf5826f2 Merge branch 'master' into docs-tweaks 2018-03-19 14:52:21 -03:00
Chi Vinh Le 3821477ef0 Remove some comments 2018-03-19 00:32:06 +01:00
Chi Vinh Le 8aa8517d1d Implement Coral RTE 2018-03-19 00:29:01 +01:00
okbel 40782a5d0b Adding off method to the Stream Interface 2018-03-17 18:55:39 -03:00
okbel 0209cc5b13 refactor due to auth probs 2018-03-17 16:44:01 -03:00
okbel a700e91911 adding debugPlugins 2018-03-17 16:26:46 -03:00
okbel 96dff8ed25 wip :0 2018-03-16 20:16:28 -03:00
Kim Gardner f346cf4caf Merge pull request #1451 from coralproject/asset-manager-tutorial
Asset Manager Tutorial
2018-03-15 21:07:24 -04:00
Kim Gardner a84ad511e8 Merge branch 'master' into asset-manager-tutorial 2018-03-15 21:00:23 -04:00
Wyatt Johnson 3b2a9e5c75 improved context perf 2018-03-15 15:03:01 -06:00
Wyatt Johnson c9ec5ca2ce Merge pull request #1441 from coralproject/restore-new-user-event
Restore the userCreated event
2018-03-15 13:30:00 -06:00
Wyatt Johnson c27def3167 Asset Manager Tutorial 2018-03-15 12:46:02 -06:00
Kiwi cb6fe6fd16 Merge branch 'master' into restore-new-user-event 2018-03-15 18:47:26 +01:00
Chi Vinh Le 9d9adc8195 Rename typo 2018-03-15 18:38:21 +01:00
Kiwi 164c4e30b8 Merge branch 'master' into extract-css-n-caching 2018-03-15 17:50:24 +01:00
Kiwi 82280a7da7 Merge branch 'master' into better-graph 2018-03-15 17:49:31 +01:00
Wyatt Johnson 4a05a45379 Merge pull request #1440 from coralproject/del-user
User Delete
2018-03-15 10:01:55 -06:00
Kiwi cbe2725f00 Merge branch 'master' into restore-new-user-event 2018-03-15 16:57:06 +01:00
okbel 7d7e3f60d3 show dep message only once 2018-03-14 23:33:06 -03:00
okbel fb519286c3 Merge branch 'slots-debug' of github.com:coralproject/talk into slots-debug
* 'slots-debug' of github.com:coralproject/talk: (78 commits)
  added translations
  lint
  improved db query support, added tests
  added .vscode to gitignore
  Disallow logout from unauthenticated requests
  parse env json the same as the rest, with hjson
  Slack plugin fix
  disabled firefox local integration tests :(
  re-enabled headless support
  added logs to artifacts
  disable headless tests, run with full browsers
  applied fix to allow local run with firefox
  store test results as artifacts every time
  replaced circleci image with ours temp
  Update Comment.js
  Update UserDetailComment.js
  Update Comment.js
  Update UserDetailComment.js
  Remove curly quote
  Update sidebar
  ...
2018-03-14 23:22:24 -03:00
okbel 4f844dfd58 Adding deprecation notice 2018-03-14 22:38:27 -03:00
Belén Curcio 5cde5f89d4 Merge branch 'master' into slots-debug 2018-03-14 21:58:14 -03:00
Kiwi b64ab62807 Merge branch 'master' into extract-css-n-caching 2018-03-15 00:42:08 +01:00
Chi Vinh Le a23f4fd5db Fix css order 2018-03-15 00:40:10 +01:00
Kim Gardner 804711cac5 Merge branch 'master' into del-user 2018-03-14 18:30:41 -04:00
Kim Gardner 7c8305695c Merge pull request #1447 from coralproject/logout-bug
Logout Fix
2018-03-14 18:30:19 -04:00
Kim Gardner 21722d36ea Merge branch 'master' into restore-new-user-event 2018-03-14 18:19:29 -04:00
Kim Gardner 867a0d1ea7 Merge branch 'master' into logout-bug 2018-03-14 18:18:50 -04:00
Kim Gardner adbf041bbe Fix rainbow emoji, add name of Part 2 tutorial 2018-03-14 18:11:53 -04:00
Wyatt Johnson cc06808e9b Merge pull request #1442 from ollyd/master
Use asset.url as a fallback when asset.title is missing
2018-03-14 15:45:46 -06:00
Wyatt Johnson 8c7e8080c3 added translations 2018-03-14 15:13:44 -06:00
Kim Gardner 40228a8ff4 Merge branch 'master' into better-graph 2018-03-14 17:13:30 -04:00
Wyatt Johnson bb1b265cae lint 2018-03-14 15:12:38 -06:00
Wyatt Johnson 6b486c86a5 Merge branch 'master' into master 2018-03-14 15:02:01 -06:00
Wyatt Johnson 6c591e803b Merge pull request #1427 from kitwestneat/name-collision
checks for and mitigates username collisions with new external users
2018-03-14 15:01:37 -06:00
Wyatt Johnson 2f1689d2ca Merge branch 'master' into name-collision 2018-03-14 14:55:54 -06:00
Wyatt Johnson 1a8006e3a3 improved db query support, added tests 2018-03-14 14:55:24 -06:00
Chi Vinh Le d58bc5cfb1 Remove unwanted emptyline 2018-03-14 20:46:53 +01:00
Chi Vinh Le 608db5cdb0 Merge branch 'extract-css-n-caching' of ssh://github.com/coralproject/talk into extract-css-n-caching 2018-03-14 20:43:50 +01:00
Chi Vinh Le 3d571a60c2 More comments 2018-03-14 20:43:27 +01:00
Kiwi 713f3230fe Merge branch 'master' into extract-css-n-caching 2018-03-14 20:39:43 +01:00
Chi Vinh Le 747817edd8 Little Comment 2018-03-14 20:31:16 +01:00
Chi Vinh Le 418a51cbb4 Cache babel-loader branch wide in CI 2018-03-14 20:28:22 +01:00
Chi Vinh Le f74641a548 Cache busting 2018-03-14 20:24:26 +01:00
Wyatt Johnson cbd3b2814e added .vscode to gitignore 2018-03-14 11:23:40 -06:00
Wyatt Johnson 4c2424c323 Merge branch 'master' into del-user 2018-03-14 11:08:35 -06:00
Wyatt Johnson bec3e94bbc Disallow logout from unauthenticated requests 2018-03-14 11:02:37 -06:00
Kiwi 784175ae0a Merge branch 'master' into better-graph 2018-03-14 17:35:12 +01:00
Kim Gardner 6a6b7eab7c Merge pull request #1438 from coralproject/docs-plugin-tutorial-part-1
Adding Plugin Tutorials to Docs
2018-03-14 11:26:21 -04:00
Wyatt Johnson 3bdded34b5 Merge branch 'master' into docs-plugin-tutorial-part-1 2018-03-14 09:19:16 -06:00
Chi Vinh Le 106b2faaf1 Extract css 2018-03-14 14:25:00 +01:00
Chi Vinh Le 3d8fc116a7 Fix defaultComponent bug 2018-03-14 11:32:13 +01:00
Chi Vinh Le ce70c9c925 Merge branch 'master' into better-graph 2018-03-14 09:59:50 +01:00
Kim Gardner 1f548e1c5e Merge branch 'master' into del-user 2018-03-13 21:21:05 -04:00
Kim Gardner 35207888da Merge pull request #1439 from coralproject/job-separation
Job Separation
2018-03-13 19:52:51 -04:00
Kim Gardner 50158d16aa Merge branch 'master' into job-separation 2018-03-13 19:32:45 -04:00
Kim Gardner 3c03999814 Merge pull request #1435 from coralproject/rte-upgrade
Rich Text Plugin Upgrade - Escaping <blockquote>
2018-03-13 19:32:23 -04:00
Kim Gardner 9ed17dd949 Merge branch 'master' into slots-debug 2018-03-13 19:32:19 -04:00
Kim Gardner e25b2d01c2 Merge branch 'master' into del-user 2018-03-13 19:32:02 -04:00
Kim Gardner 8db3f72bb4 Merge branch 'master' into restore-new-user-event 2018-03-13 19:31:50 -04:00
Kim Gardner 5136683018 Merge branch 'master' into master 2018-03-13 19:31:43 -04:00
Kim Gardner 94fa21c57f Merge branch 'master' into job-separation 2018-03-13 19:31:20 -04:00
Kim Gardner 8dfa9de3f8 Fix merge conflict 2018-03-13 19:29:14 -04:00
Kim Gardner d2c8fa03a5 Merge branch 'master' into rte-upgrade 2018-03-13 19:24:30 -04:00
Wyatt Johnson 60c4f56132 Merge pull request #1445 from coralproject/slack-fix
Slack plugin fix
2018-03-13 17:10:03 -06:00
Wyatt Johnson 56fab6be6c Merge branch 'master' into slack-fix 2018-03-13 17:03:40 -06:00
Wyatt Johnson 4fcdec92d8 Merge pull request #1434 from evgenykireev/fixing-plugins-env-js
do not use hjson for plugins.env.js
2018-03-13 17:03:18 -06:00
Wyatt Johnson a36960a6f0 parse env json the same as the rest, with hjson 2018-03-13 16:55:02 -06:00
Wyatt Johnson 613688456a Merge branch 'master' into fixing-plugins-env-js 2018-03-13 16:51:10 -06:00
Wyatt Johnson ecb457fef3 Merge pull request #1437 from coralproject/docs-updates
Docs updates
2018-03-13 16:50:55 -06:00
Chi Vinh Le 73fce8624c Fix query data detection 2018-03-13 23:32:21 +01:00
Wyatt Johnson 965c6f2934 Merge branch 'master' into docs-updates 2018-03-13 16:31:51 -06:00
Wyatt Johnson c01de4f24d Merge pull request #1432 from coralproject/user-create
Restored User Creation CLI
2018-03-13 16:31:32 -06:00
Wyatt Johnson f49c095dfa Merge branch 'master' into user-create 2018-03-13 16:21:36 -06:00
Wyatt Johnson 6a02f666ea Merge pull request #1433 from memz/ar_translation
Arabic Translation
2018-03-13 16:21:18 -06:00
Chi Vinh Le 414b62ff66 Refactor talk-plugin-notifications using the new withGraphQLExtension 2018-03-13 23:11:27 +01:00
Wyatt Johnson 403c1996bf Merge branch 'master' into docs-updates 2018-03-13 16:03:56 -06:00
Wyatt Johnson 2cb8bf324f Merge branch 'master' into fixing-plugins-env-js 2018-03-13 16:03:22 -06:00
Wyatt Johnson 07bec45ff8 Merge branch 'master' into ar_translation 2018-03-13 16:03:14 -06:00
Wyatt Johnson 028f2a0d11 Merge branch 'master' into name-collision 2018-03-13 16:03:08 -06:00
Wyatt Johnson c402ef4a03 Merge branch 'master' into slack-fix 2018-03-13 16:02:49 -06:00
Wyatt Johnson ed16cd1d60 Merge pull request #1443 from coralproject/integration-fix
Integration Fixes
2018-03-13 16:01:49 -06:00
Wyatt Johnson 0dcb0bcaab Slack plugin fix 2018-03-13 16:01:38 -06:00
Wyatt Johnson a0d2a4147c disabled firefox local integration tests :( 2018-03-13 15:39:13 -06:00
Wyatt Johnson b6a2d791ec re-enabled headless support 2018-03-13 15:18:54 -06:00
Chi Vinh Le 79f885244a Add support for withGraphQLExtension 2018-03-13 22:10:00 +01:00
Wyatt Johnson 7af9458710 added logs to artifacts 2018-03-13 14:46:00 -06:00
Wyatt Johnson 7598784acc disable headless tests, run with full browsers 2018-03-13 14:33:52 -06:00
Wyatt Johnson 8613ced71d applied fix to allow local run with firefox 2018-03-13 14:19:23 -06:00
Chi Vinh Le a81ae2b7f8 Remove data prop from Slots 2018-03-13 21:06:32 +01:00
Chi Vinh Le 5e4d010246 Deprecate passing data prop to Slot 2018-03-13 20:43:06 +01:00
Wyatt Johnson 1b3a74a011 store test results as artifacts every time 2018-03-13 13:33:45 -06:00
Chi Vinh Le 84f1003b2b Get rid of data direct dependency in the plugins 2018-03-13 19:58:32 +01:00
Wyatt Johnson 22e0aef306 replaced circleci image with ours temp 2018-03-13 12:13:21 -06:00
Chi Vinh Le 9ad92e38c0 Move profile settings to core 2018-03-13 17:48:54 +01:00
Chi Vinh Le 5bb5f98b17 Refactor Slot Feature 2018-03-13 16:05:54 +01:00
Olly Dutton 6efda40e29 Update Comment.js
fix linting error
2018-03-13 15:34:28 +11:00
Olly Dutton 8e0c53ef3b Update UserDetailComment.js
fix linting error
2018-03-13 15:33:46 +11:00
Olly Dutton bfb9ea1eea Update Comment.js
Ternary to display asset url if there's no asset title in admin comments
2018-03-13 12:18:21 +11:00
Olly Dutton 93e850ba3f Update UserDetailComment.js
Ternary to display asset url if there's no asset title in admin comments
2018-03-13 12:16:59 +11:00
Wyatt Johnson da6b5c7f36 fixed some missing calls to service 2018-03-12 16:54:18 -06:00
Wyatt Johnson ccda23ec60 fixed bug with endpoint 2018-03-12 16:49:44 -06:00
Chi Vinh Le 0425c39bfe Remove requirement for data.variables in withFragment 2018-03-12 23:44:02 +01:00
Wyatt Johnson f826db1edf Restore the userCreated event 2018-03-12 16:39:38 -06:00
Kim Gardner 77839c1fbe Merge branch 'master' into rte-upgrade 2018-03-12 18:08:37 -04:00
Kim Gardner 9f1c59da11 Merge branch 'master' into slots-debug 2018-03-12 18:08:16 -04:00
Kim Gardner 940185d9b6 Remove curly quote 2018-03-12 17:54:51 -04:00
Wyatt Johnson f5fd162b37 moved user deletion into graph 2018-03-12 15:39:50 -06:00
Kim Gardner 810d43cc6f Update sidebar 2018-03-12 17:35:22 -04:00
Kim Gardner a6adb0ceba Adding Part 2 2018-03-12 17:34:46 -04:00
Kit Westneat 2cfbc1bb12 Merge branch 'master' into name-collision 2018-03-12 17:05:22 -04:00
Kim Gardner 4df803187f Relative link to Talk quickstart 2018-03-12 16:28:55 -04:00
Kim Gardner fd88ae9433 Change y to and 2018-03-12 16:26:47 -04:00
Kim Gardner 0937e8a946 Fix sidebar 2018-03-12 16:25:44 -04:00
Kim Gardner 686074f6cd Set max-width for images 2018-03-12 16:16:49 -04:00
Kim Gardner 931c21539b Create image folder and upload images 2018-03-12 16:16:33 -04:00
Kim Gardner 8fbbe62cdb Add Plugin Tutorial Part 1 2018-03-12 16:15:57 -04:00
Wyatt Johnson 96323de147 added option to disable jobs from starting 2018-03-12 14:10:51 -06:00
Wyatt Johnson 21e3e24d9f Docs updates 2018-03-12 12:26:26 -06:00
Wyatt Johnson 31c524688c Merge branch 'master' into fixing-plugins-env-js 2018-03-12 11:38:21 -06:00
okbel b80184d9ee set debug to false 2018-03-12 14:29:18 -03:00
okbel 5dbbf80068 Adding it to the docs, not sure if it should live there. 2018-03-12 14:27:41 -03:00
Kit Westneat c7d21438df checks for and mitigates username collisions with new external users 2018-03-12 13:09:12 -04:00
okbel 77be539710 Adding it to the docs, not sure if it should live there. 2018-03-12 13:49:35 -03:00
okbel 68fb511223 desc styling 2018-03-12 13:41:00 -03:00
okbel 6200ba39c2 Adding debug tools 2018-03-12 10:21:42 -03:00
Kim Gardner bc030930cc Merge branch 'master' into ar_translation 2018-03-12 08:36:41 -04:00
Kim Gardner 907554044d Merge branch 'master' into user-create 2018-03-12 08:35:52 -04:00
Kim Gardner 2f5fc03e9c Merge pull request #1431 from coralproject/docs-updates
Updated coralproject.github.io links to docs.coralproject.net
2018-03-12 08:35:29 -04:00
okbel e713b39846 clearer api - wip debug tools 2018-03-12 09:17:30 -03:00
Belén Curcio ed94039286 Merge branch 'master' into rte-upgrade 2018-03-12 08:13:24 -03:00
okbel f321d9ecaf upgraded 2018-03-12 08:11:31 -03:00
Kireev, Eugene 77ecc5e8df linting fixes 2018-03-12 16:36:42 +11:00
Kireev, Eugene 05b0dc2d80 do not use hjson for plugins.env.js 2018-03-12 13:58:35 +11:00
Melhem Fawaz 5b885bfb3c Added Arabic translations for most plugins 2018-03-11 17:52:45 +04:00
Melhem Fawaz 820153429f Added most Arabic translations in 'ar' locale 2018-03-11 16:48:08 +04:00
Melhem Fawaz 969b3dbcd5 Registered AR locale in i18n framework service 2018-03-11 16:27:28 +04:00
Wyatt Johnson 28935cc25d updated copy 2018-03-09 17:13:00 -07:00
Wyatt Johnson cacab7aa23 missed another link 2018-03-09 17:12:03 -07:00
Wyatt Johnson 6298658194 restored user creation cli 2018-03-09 17:11:19 -07:00
Wyatt Johnson a32a205069 updates to some docs 2018-03-09 17:07:58 -07:00
Wyatt Johnson 75c9269d8d Merge pull request #1421 from clintabrown/viewing-options-sort-option-classnames
Add classname hooks for viewing-options-sort-option default and active state
2018-03-09 17:02:04 -07:00
Wyatt Johnson 615c3e7aa3 Merge branch 'master' into viewing-options-sort-option-classnames 2018-03-09 16:49:56 -07:00
Wyatt Johnson 4612ccb049 Merge pull request #1422 from rareinator/Danish-translation
Update Danish translation
2018-03-09 16:43:46 -07:00
Wyatt Johnson cfff0becbb Merge branch 'master' into Danish-translation 2018-03-09 16:35:34 -07:00
Kim Gardner 042e76a19f Merge pull request #1430 from coralproject/docs
Fix sidebar, update docs
2018-03-09 16:51:11 -05:00
Wyatt Johnson 0b2faf4bc2 updating docs 2018-03-09 14:27:27 -07:00
Wyatt Johnson 7bd0330be1 fixed sidebar 2018-03-09 14:26:09 -07:00
Kim Gardner 40625b6184 Merge pull request #1399 from coralproject/docs
Documentation Update
2018-03-09 16:24:46 -05:00
Wyatt Johnson 59137f5f54 added tags to plugin directory 2018-03-09 13:55:53 -07:00
Wyatt Johnson 933a65a508 updated default plugins 2018-03-09 13:40:05 -07:00
Wyatt Johnson 57ae878452 docs updates 2018-03-09 13:34:55 -07:00
Wyatt Johnson 5b37a04341 Merge branch 'master' into docs 2018-03-09 13:01:36 -07:00
Wyatt Johnson 7b4baba28e Merge pull request #1428 from coralproject/disable-ie-safari-build
Disable safari and ie integration test on CI
2018-03-09 12:13:35 -07:00
Chi Vinh Le 2d0cafee50 Disable safari and ie integration test on CI 2018-03-09 20:06:21 +01:00
Chi Vinh Le 0708025f81 Fix lint issues 2018-03-09 19:58:54 +01:00
Chi Vinh Le 3c854d0468 Fix path 2018-03-09 19:54:16 +01:00
Chi Vinh Le c22de3832c Move SortOption to talk-plugin-viewing-options 2018-03-09 19:52:35 +01:00
Chi Vinh Le cd638e7f85 Merge branch 'master' into refactor-graph 2018-03-09 19:27:35 +01:00
Chi Vinh Le 0397906907 Port coral-admin to new passthrough prop 2018-03-09 19:15:33 +01:00
Chi Vinh Le 44b8809db1 Port to new Slot property passthrough 2018-03-09 17:34:05 +01:00
Chi Vinh Le 1b55684a73 New Slot property passthrough 2018-03-09 17:33:34 +01:00
Chi Vinh Le e0dc871367 Rename slotSize to size 2018-03-09 14:50:34 +01:00
Chi Vinh Le 7bcad6d0c0 Attach query markers 2018-03-09 14:50:18 +01:00
Wyatt Johnson 44f187dafa added plugin directory 2018-03-08 19:58:48 -07:00
Wyatt Johnson 518e4115ee added fixes for netlify 2018-03-08 15:05:52 -07:00
Wyatt Johnson 15f5e27aa4 fixes to gitignore 2018-03-08 15:03:59 -07:00
Kim Gardner ccefffb7fa Merge branch 'master' into docs 2018-03-08 15:31:26 -05:00
Kim Gardner 2979b16462 Merge branch 'master' into Danish-translation 2018-03-08 14:56:48 -05:00
Wyatt Johnson 2ae520fac4 fixed public dir 2018-03-08 12:56:43 -07:00
Kim Gardner 4eb2d83c04 Merge branch 'master' into viewing-options-sort-option-classnames 2018-03-08 14:48:10 -05:00
Kim Gardner 0b9ba9a0e3 Merge pull request #1423 from coralproject/comment-history-blank
Comment history blank state
2018-03-08 14:47:27 -05:00
Kim Gardner 1a3979bbeb Merge branch 'master' into comment-history-blank 2018-03-08 14:33:43 -05:00
Kim Gardner 6efe975980 Merge pull request #1424 from coralproject/ignore-user-blank
Ignore user blank state
2018-03-08 14:33:34 -05:00
Kim Gardner e36252cb72 Merge branch 'master' into comment-history-blank 2018-03-08 14:12:26 -05:00
Kim Gardner db44863658 Merge branch 'master' into ignore-user-blank 2018-03-08 14:12:23 -05:00
Kim Gardner 929f4535a6 Merge pull request #1419 from coralproject/notification-digests
Notification Digesting
2018-03-08 14:11:59 -05:00
Kim Gardner b2daf7114a Merge branch 'master' into ignore-user-blank 2018-03-08 13:44:07 -05:00
Kim Gardner 6cfb2aa016 Merge branch 'master' into comment-history-blank 2018-03-08 13:40:29 -05:00
Kim Gardner 2c46de9451 Merge branch 'master' into Danish-translation 2018-03-08 13:39:29 -05:00
Kim Gardner d7e9295309 Merge branch 'master' into viewing-options-sort-option-classnames 2018-03-08 13:39:16 -05:00
Kim Gardner 420c1728c6 Merge branch 'master' into notification-digests 2018-03-08 12:51:08 -05:00
Kim Gardner a67c4a8142 Stub docs for Installing Plugins 2018-03-08 12:49:18 -05:00
Kim Gardner 4c8ef59495 Merge pull request #1425 from coralproject/scraping
Scraping Fixes
2018-03-08 12:41:20 -05:00
Chi Vinh Le ef78654d23 Ignore user blank state 2018-03-08 16:17:15 +01:00
Chi Vinh Le c2406df46f comment history blank state 2018-03-08 15:59:12 +01:00
Chi Vinh Le af80d795ad Only show digest options when having choice 2018-03-08 15:17:36 +01:00
Chi Vinh Le e8edfa04dd Merge branch 'notification-digests' of ssh://github.com/coralproject/talk into notification-digests 2018-03-08 14:37:24 +01:00
Chi Vinh Le 866d6d8643 Adapt styling 2018-03-08 14:36:43 +01:00
Morten Nissen 4ce2e6f691 Update danish translation 2018-03-08 10:06:21 +01:00
Morten Nissen 25b72cbcab Merge pull request #3 from coralproject/master
merge from master
2018-03-08 08:40:34 +01:00
Clint Brown e5891822fb Fix linting issue 2018-03-08 12:38:25 +11:00
Clint Brown 4f93086909 Add classname hooks for default and active state 2018-03-08 12:21:07 +11:00
Kim Gardner f450661991 Fix formatting 2018-03-07 17:44:00 -05:00
Kim Gardner e8a2d09df2 Add Arch docs 2018-03-07 17:41:40 -05:00
Kim Gardner 01d03e77f8 Update Sidebar Nav 2018-03-07 17:37:13 -05:00
Wyatt Johnson 435067f619 Scraping Fixes
- Fixed bugs with scraping graphql endpoint
- Added traceID to logging for jobs
2018-03-07 15:30:34 -07:00
Kim Gardner 60a704f694 Update i18n 2018-03-07 17:29:54 -05:00
Kim Gardner 86683ee21c Add i18n docs 2018-03-07 17:25:48 -05:00
Kim Gardner ac5062fc01 Update filename 2018-03-07 17:24:29 -05:00
Kim Gardner 3b15cd76c1 Add CSS docs 2018-03-07 17:23:38 -05:00
Kim Gardner e76127d9ee Add Event Tracking and Metrics docs 2018-03-07 17:13:41 -05:00
Kim Gardner 4ae9920732 Add Notifications docs 2018-03-07 17:11:08 -05:00
Kim Gardner f48062e38f Add Admin configuration docs 2018-03-07 17:10:57 -05:00
Kim Gardner 0fb6645104 Add Comment Stream configuration docs 2018-03-07 17:09:33 -05:00
Wyatt Johnson ff71285fa9 Merge branch 'master' into notification-digests 2018-03-07 14:25:54 -07:00
Wyatt Johnson 48b5afafab Resolves edge case with old digest frequency 2018-03-07 14:22:24 -07:00
Kim Gardner 8a5059934c Add Auth docs 2018-03-07 16:19:36 -05:00
Kim Gardner 40a3a24ba0 Fix merge conflict 2018-03-07 14:08:19 -05:00
Kim Gardner 98facd1019 Merge pull request #1420 from coralproject/plugin-docker-regression
Workspace + Plugin Regression
2018-03-07 14:02:12 -05:00
Wyatt Johnson 2e9e7c297b Fixed regression with workspaces 2018-03-07 11:30:26 -07:00
Chi Vinh Le e72622e913 Fix linting stuff 2018-03-07 14:52:49 +01:00
Chi Vinh Le 6caf2f26f5 Some comments 2018-03-07 14:51:57 +01:00
Chi Vinh Le 861f82a168 Do not capitalize 2018-03-07 14:42:43 +01:00
Chi Vinh Le 497fe606dc Mutate settings 2018-03-07 14:39:07 +01:00
Chi Vinh Le e6b28a55af Display digest settings 2018-03-07 14:38:53 +01:00
Kiwi 033c6464e9 Merge branch 'master' into notification-digests 2018-03-07 12:03:44 +01:00
Kim Gardner a4a22c0758 Merge pull request #1391 from coralproject/rte-plugin
Rich Text Editor Plugin
2018-03-06 20:29:13 -05:00
Kim Gardner 1b8276cd92 Merge branch 'master' into rte-plugin 2018-03-06 20:18:08 -05:00
Kim Gardner 72151e0afd Merge pull request #1418 from coralproject/scrape-assets
Scrape Asset GraphQL Mutation
2018-03-06 20:13:56 -05:00
Wyatt Johnson 9cc9969320 Notification Digesting 2018-03-06 16:20:15 -07:00
Wyatt Johnson 005602a738 Standardized metadata 2018-03-06 11:03:58 -07:00
Wyatt Johnson 09dcca27a8 added revision hash 2018-03-05 17:16:29 -07:00
Chi Vinh Le 17f41fa5d0 Merge branch 'rte-plugin' of ssh://github.com/coralproject/talk into rte-plugin 2018-03-05 22:28:43 +01:00
Chi Vinh Le 62cdf4988f Remove unused line 2018-03-05 22:27:55 +01:00
Kiwi 485e02fb1c Merge branch 'master' into rte-plugin 2018-03-05 22:25:08 +01:00
Chi Vinh Le 090920131f Attach root fragment 2018-03-05 22:24:35 +01:00
Chi Vinh Le f50b3f365d Prevent unintended initial empty line 2018-03-05 22:02:58 +01:00
okbel 4320263bcc Add regext to test multiline strings 2018-03-05 17:55:56 -03:00
okbel d26e2a328f html and content editable normalizer 2018-03-05 17:49:05 -03:00
Kim Gardner 6a99a983c5 Merge branch 'master' into scrape-assets 2018-03-05 15:14:52 -05:00
Kim Gardner 801fc8bc15 Merge pull request #1413 from coralproject/confirmed-email-notifications
Email Confirmation Notifications
2018-03-05 15:10:29 -05:00
okbel be33948497 Merge branch 'rte-plugin' of github.com:coralproject/talk into rte-plugin
* 'rte-plugin' of github.com:coralproject/talk:
  Update Github Issue template
2018-03-05 17:04:26 -03:00
okbel 930ff603c3 Metadata override 2018-03-05 17:00:30 -03:00
Chi Vinh Le aa754657a2 Fix styling and toggle off issues 2018-03-05 20:53:01 +01:00
Kim Gardner 5fcfb45a10 Merge branch 'master' into rte-plugin 2018-03-05 14:11:14 -05:00
Kim Gardner 77274be2e4 Merge branch 'master' into confirmed-email-notifications 2018-03-05 14:10:35 -05:00
Kim Gardner ff7fac38ff Merge pull request #1415 from coralproject/update-github-issue-template
Update Github Issue template
2018-03-05 14:08:42 -05:00
Wyatt Johnson a749a13786 Scrape Asset GraphQL Mutation
- Adds support for force scraping the asset via a GraphQL mutation.
2018-03-05 11:53:52 -07:00
okbel be62a2780c normalized blockquote 2018-03-05 14:48:32 -03:00
okbel 0f58c1b780 Adding fragments to the slot 2018-03-05 14:46:47 -03:00
okbel dcddfa4f39 Adding fragments to the slot 2018-03-05 14:46:09 -03:00
okbel 59da1ec1af Merge branch 'rte-plugin' of github.com:coralproject/talk into rte-plugin
* 'rte-plugin' of github.com:coralproject/talk:
  Fix file name casing
2018-03-05 14:41:15 -03:00
okbel 284598439d adding slot userDetailCommentContent 2018-03-05 14:40:51 -03:00
okbel 95da5697fc Adding styles 2018-03-05 14:29:19 -03:00
okbel 7962df6983 adding br to the purifier 2018-03-05 14:14:22 -03:00
Chi Vinh Le a1f6800d99 Fix file name casing 2018-03-05 17:45:56 +01:00
Chi Vinh Le 87cb2b53c7 Fix translation 2018-03-05 17:15:58 +01:00
Chi Vinh Le 047beb1ae9 Implement Require Email for Notifications on Frontend 2018-03-05 17:12:05 +01:00
okbel 515867bf14 quotes styling 2018-03-05 13:00:29 -03:00
okbel 87ea7b5dae Merge issues 2018-03-05 12:56:36 -03:00
Chi Vinh Le 8113c4f8b8 Merge branch 'confirmed-email-notifications' of ssh://github.com/coralproject/talk into confirmed-email-notifications 2018-03-05 14:03:26 +01:00
okbel 1d31099c9d Passing down root data 2018-03-05 08:49:59 -03:00
Kim Gardner 3f2a97f42b Update Github Issue template 2018-03-02 16:29:41 -05:00
Wyatt Johnson 6f0b0727e8 Merge branch 'master' into confirmed-email-notifications 2018-03-02 10:29:44 -07:00
Wyatt Johnson 179edb88be fixes 2018-03-02 10:29:17 -07:00
okbel 5f5bc631b6 Merge branch 'master' of github.com:coralproject/talk into rte-plugin
* 'master' of github.com:coralproject/talk: (103 commits)
  Implement new permlink view for real
  fixes to ci for deploy
  fixed deploy
  changed max retries on unreliable tests
  always save test results
  fixed workspace error
  implemented staff replies
  adjusted client tests
  seperated tests
  more fixes to translation
  fixed translation
  review
  object propery typo
  added safari to integration jobs
  added develop filter
  added deeper cache support
  added dist cache support
  fixed firefox support
  removed headless
  ammended browserstack test
  ...
2018-03-02 12:30:22 -03:00
Chi Vinh Le f558e38a45 Notifications only when using local provider 2018-03-02 15:43:15 +01:00
Kim Gardner 8d147dbf47 Merge pull request #1406 from coralproject/permalink-enh
Permalink 2
2018-03-01 18:19:54 -05:00
Chi Vinh Le 91dd9b157a Implement new permlink view for real 2018-03-02 00:00:51 +01:00
okbel 11b98370b6 hook handler 2018-03-01 19:59:02 -03:00
okbel bc273d16f7 hook to clear text after submiting a comment 2018-03-01 19:43:54 -03:00
Wyatt Johnson 8cb645651c exposed notification setting via graph 2018-03-01 15:28:14 -07:00
Wyatt Johnson 86c221d6f9 added some docs 2018-03-01 15:23:07 -07:00
Kim Gardner 98b517affb Merge branch 'master' into permalink-enh 2018-03-01 17:00:41 -05:00
Wyatt Johnson 25dbcf7186 cleanup 2018-03-01 14:57:41 -07:00
Wyatt Johnson 86c36f7d39 Email confirmation check
- filtering for confirmed emails
- fixes to logger to expose logger controls
- refactored graphql calls in other notification plugins
2018-03-01 14:43:29 -07:00
okbel 8192a3bfc4 CommentContent added to the admin side 2018-03-01 18:38:14 -03:00
Wyatt Johnson 58269a7cae Merge pull request #1412 from coralproject/ci-fixes
CI Fixes
2018-03-01 12:52:52 -07:00
okbel 0055c82166 Passing the comment down until we reach the queryData 2018-03-01 16:47:15 -03:00
Wyatt Johnson 5f9c6b3b88 fixes to ci for deploy 2018-03-01 12:46:11 -07:00
okbel e055a3e4d4 Adding rootquery support 2018-03-01 16:39:58 -03:00
Kiwi 57d7920c59 Merge branch 'master' into permalink-enh 2018-03-01 20:13:04 +01:00
Kim Gardner cc9b030fb3 Merge pull request #1410 from coralproject/staff-notifications
Staff Reply Notifications
2018-03-01 14:10:19 -05:00
Wyatt Johnson da6ac290aa Merge branch 'master' into staff-notifications 2018-03-01 11:51:44 -07:00
Kiwi 3610e96c74 Merge pull request #1409 from coralproject/featured-notifications
Featured Notifications
2018-03-01 19:45:52 +01:00
okbel 300e518c2d Rolling back classes 2018-03-01 14:39:25 -03:00
okbel eaf403353f Grab rootQuery too! 2018-03-01 14:16:15 -03:00
okbel d1c0167e9a Simpler fragments 2018-03-01 14:12:07 -03:00
okbel 3fd1d6705d fragment added 2018-03-01 11:56:35 -03:00
okbel de69cf5790 wip changes 2018-03-01 11:27:21 -03:00
okbel a3158a494c Changes added 2018-03-01 10:29:03 -03:00
Wyatt Johnson 8cb75e3bb1 fixed deploy 2018-02-28 17:31:52 -07:00
Wyatt Johnson de54b916ef changed max retries on unreliable tests 2018-02-28 17:22:53 -07:00
Wyatt Johnson 6426d3ebd8 always save test results 2018-02-28 17:22:53 -07:00
Wyatt Johnson 11687b06d0 upped versions of hexo 2018-02-28 16:30:07 -07:00
Wyatt Johnson cf87b52177 Merge branch 'master' into docs 2018-02-28 16:29:25 -07:00
Wyatt Johnson 9be6a3cce6 Merge branch 'master' into featured-notifications 2018-02-28 16:12:53 -07:00
Wyatt Johnson 288768793a Merge pull request #1411 from coralproject/reconcile-fix
Reconcile Fix
2018-02-28 16:12:34 -07:00
Wyatt Johnson bd93d2d5b5 fixed workspace error 2018-02-28 15:54:26 -07:00
Wyatt Johnson 6b54957760 Merge branch 'master' into featured-notifications 2018-02-28 15:30:47 -07:00
Wyatt Johnson 5afa4fa269 implemented staff replies 2018-02-28 15:30:18 -07:00
okbel ba685a05a2 the fragment tree 2018-02-28 18:48:12 -03:00
Kim Gardner 4304cad787 Merge pull request #1408 from coralproject/plugins-debug
Fixes for the plugin config and plugins debug
2018-02-28 16:34:01 -05:00
Kim Gardner d969da540f Merge branch 'master' into plugins-debug 2018-02-28 16:29:04 -05:00
okbel 20c29cd81c removing slot name change 2018-02-28 18:22:15 -03:00
okbel 72e80a4693 changes 2018-02-28 18:16:32 -03:00
Wyatt Johnson 80818b0861 Merge branch 'master' into permalink-enh 2018-02-28 14:10:12 -07:00
okbel 20bec20437 changes 2018-02-28 18:07:28 -03:00
Wyatt Johnson 2451d4b6d6 adjusted client tests 2018-02-28 14:00:56 -07:00
Wyatt Johnson 744348dee5 seperated tests 2018-02-28 13:50:36 -07:00
Wyatt Johnson d2fafafb84 Merge branch 'master' into featured-notifications 2018-02-28 13:26:58 -07:00
Wyatt Johnson 1a7f7dddd4 more fixes to translation 2018-02-28 13:26:35 -07:00
Wyatt Johnson 7ccb1e26a4 fixed translation 2018-02-28 13:26:08 -07:00
Wyatt Johnson c91ac80df6 Merge pull request #1407 from coralproject/circleci
CircleCI 2.0
2018-02-28 12:26:58 -07:00
Wyatt Johnson 30271ac945 review 2018-02-28 12:10:42 -07:00
Wyatt Johnson 6e20a43e29 Merge branch 'master' into circleci 2018-02-28 10:21:52 -07:00
Wyatt Johnson 16448a025e Merge branch 'master' into featured-notifications 2018-02-28 10:18:53 -07:00
Belén Curcio 8fb4f58eab Merge branch 'master' into plugins-debug 2018-02-28 14:18:19 -03:00
okbel b5843343a9 object propery typo 2018-02-28 14:14:21 -03:00
Wyatt Johnson 910425caea added safari to integration jobs 2018-02-28 09:21:26 -07:00
Kiwi 37cb8d3690 Merge branch 'master' into permalink-enh 2018-02-28 14:58:32 +01:00
okbel 70d081df4a Minimal styling and old code removal 2018-02-28 10:05:28 -03:00
Wyatt Johnson 6555e0fcaa added develop filter 2018-02-27 21:55:31 -07:00
Wyatt Johnson e24deda936 added deeper cache support 2018-02-27 21:46:56 -07:00
Wyatt Johnson b8ddfe4ae4 added dist cache support 2018-02-27 21:45:29 -07:00
Wyatt Johnson 35bfec6da6 fixed firefox support 2018-02-27 21:34:45 -07:00
Wyatt Johnson 4c5adc26cf removed headless 2018-02-27 21:17:41 -07:00
Wyatt Johnson 6e946ca31d ammended browserstack test 2018-02-27 21:10:35 -07:00
Wyatt Johnson 7c55088d9f require cache only on the yarn.lock file 2018-02-27 21:04:29 -07:00
Wyatt Johnson 0bb61da860 adjusted build pipelin 2018-02-27 21:01:00 -07:00
Wyatt Johnson 435afff2df cleanup of e2e script 2018-02-27 20:59:40 -07:00
Wyatt Johnson 8305223639 rename 2018-02-27 20:32:10 -07:00
Wyatt Johnson 57ba7e63db cleaned up the deployment workflow 2018-02-27 20:29:57 -07:00
Wyatt Johnson 847310f214 ammended to test on bs 2018-02-27 19:22:22 -07:00
Wyatt Johnson 3879ab1bff added more contexts 2018-02-27 19:16:19 -07:00
Wyatt Johnson 9f79b3f2c6 added tag filter 2018-02-27 19:03:03 -07:00
Wyatt Johnson 71d12627c8 ammended format 2018-02-27 18:59:37 -07:00
Wyatt Johnson 11812714a3 added con integration tests 2018-02-27 18:58:44 -07:00
Wyatt Johnson 3d31bec671 added to the deploy work 2018-02-27 18:43:49 -07:00
Wyatt Johnson 593468f0c1 added call to docker build 2018-02-27 18:03:52 -07:00
Wyatt Johnson b6520d0b91 Merge pull request #1403 from tomasdev/patch-1
Ability to extend Configuration Settings
2018-02-27 18:01:48 -07:00
Wyatt Johnson d0cfbf60be fixed test 2018-02-27 17:47:47 -07:00
Wyatt Johnson b9b6f035f8 modified circle.yml to 2.0 format (initial) 2018-02-27 17:38:55 -07:00
Tom Roggero a2cc18e79e yarn jslint --fix 2018-02-27 18:20:34 -05:00
Wyatt Johnson f0dd8b9690 added featured notifications 2018-02-27 16:15:20 -07:00
Tomas b9769bd309 Merge branch 'master' into patch-1 2018-02-27 17:54:35 -05:00
Wyatt Johnson 12b98d0fc6 Merge pull request #1350 from coralproject/events
Notifications
2018-02-27 15:45:17 -07:00
Chi Vinh Le 8aad744818 Only show highlighted comment 2018-02-27 23:37:44 +01:00
Wyatt Johnson cdd77339b0 fixed linting error 2018-02-27 15:23:29 -07:00
Wyatt Johnson 91b11c838b Merge branch 'master' into events 2018-02-27 15:15:56 -07:00
Chi Vinh Le f3f481fcf0 Purge config.auth_token from redux on logout 2018-02-27 15:14:46 -07:00
Chi Vinh Le a55f03f23c fix jsdoc 2 2018-02-27 15:14:46 -07:00
Chi Vinh Le 278f7772a4 fix jsdoc 2018-02-27 15:14:46 -07:00
Chi Vinh Le 6e89ba8ffb Fix closedAt wrong datatype 2018-02-27 15:14:46 -07:00
Chi Vinh Le 6037202158 Bye bye old code 2018-02-27 15:14:46 -07:00
Chi Vinh Le 4e1087c661 Remove deprecated part <3 2018-02-27 15:14:46 -07:00
Chi Vinh Le 5b38ef3422 Refactor postMessage service 2018-02-27 15:14:46 -07:00
Chi Vinh Le 09170671f9 Remove redudant request for user object 2018-02-27 15:14:46 -07:00
Wyatt Johnson e98dfaf813 linting 2018-02-27 15:14:46 -07:00
Wyatt Johnson 588a3d9065 Update plugins.js 2018-02-27 15:14:46 -07:00
Wyatt Johnson 5d58c4f82b Update Slot.js 2018-02-27 15:14:46 -07:00
Wyatt Johnson b2466a1890 replaced singleSlot with slotSize 2018-02-27 15:14:46 -07:00
Wyatt Johnson 094b8b5366 added singleSlot on the commentContent 2018-02-27 15:14:46 -07:00
Wyatt Johnson 16dceee5bf added support for the singleSlot 2018-02-27 15:14:46 -07:00
Wyatt Johnson 925d3b8b31 added sessionStorage fallback 2018-02-27 15:14:46 -07:00
Wyatt Johnson c5093ab61b linting 2018-02-27 15:14:46 -07:00
Wyatt Johnson f125fac077 replaced localStorage state events with postMessage 2018-02-27 15:14:17 -07:00
Chi Vinh Le ba62cdeab6 Change highlight styling 2018-02-27 22:27:57 +01:00
Wyatt Johnson f3b5cfa20b Merge branch 'master' into patch-1 2018-02-27 13:31:38 -07:00
Wyatt Johnson 9122c7b393 Merge pull request #1405 from coralproject/purge-config-auth-token
Purge config.auth_token from redux on logout
2018-02-27 13:30:09 -07:00
okbel d63422a4c2 Not reading the fragment just updating 2018-02-27 15:16:40 -03:00
okbel 73355ab542 Using queryData and fragments to request data 2018-02-27 15:12:44 -03:00
okbel 88c0772d52 Changes 2018-02-27 14:57:58 -03:00
okbel 58897f7571 removing vscode 2018-02-27 14:18:48 -03:00
Kiwi d750ed5d6c Merge branch 'master' into purge-config-auth-token 2018-02-27 18:05:45 +01:00
Wyatt Johnson 8fe94e5ead Merge pull request #1394 from coralproject/post-message
postMessage API
2018-02-27 09:49:11 -07:00
Belén Curcio a0305e6cb1 Merge branch 'master' into rte-plugin 2018-02-27 12:41:35 -03:00
Kim Gardner e47ab0fa37 Merge branch 'master' into patch-1 2018-02-26 20:03:58 -05:00
Chi Vinh Le 1fd64e873d Purge config.auth_token from redux on logout 2018-02-26 22:58:29 +01:00
Chi Vinh Le 918ce04e83 fix jsdoc 2 2018-02-26 22:51:46 +01:00
Chi Vinh Le 09eaba5a2e fix jsdoc 2018-02-26 22:51:02 +01:00
Chi Vinh Le 6d48c62679 Fix closedAt wrong datatype 2018-02-26 22:42:51 +01:00
Chi Vinh Le 81026af3ee Bye bye old code 2018-02-26 22:38:43 +01:00
Chi Vinh Le 0e2a49ef1f Merge branch 'post-message' of ssh://github.com/coralproject/talk into post-message 2018-02-26 22:33:50 +01:00
Chi Vinh Le c0293a4487 Remove deprecated part <3 2018-02-26 22:32:29 +01:00
Chi Vinh Le 17a0aebdf7 Refactor postMessage service 2018-02-26 22:10:01 +01:00
Wyatt Johnson 19320eb063 Merge branch 'master' into post-message 2018-02-26 13:36:34 -07:00
Kim Gardner 00a40c9e34 Merge pull request #1402 from coralproject/single-slot
slotSize Slot
2018-02-26 12:15:46 -05:00
Chi Vinh Le 1b05f146fe Remove redudant request for user object 2018-02-26 17:29:53 +01:00
Wyatt Johnson 31e5eb8685 linting 2018-02-26 09:10:55 -07:00
Wyatt Johnson d1951c8504 Update plugins.js 2018-02-26 08:48:11 -07:00
Wyatt Johnson 9158faf295 Update Slot.js 2018-02-26 08:42:39 -07:00
Tomas 77c7bb3cab Update setting.js 2018-02-24 03:08:03 -05:00
Kim Gardner beafb42c15 Merge branch 'master' into post-message 2018-02-23 19:13:15 -05:00
Wyatt Johnson 9437c5f5a3 implemented unsubscribe button 2018-02-23 17:01:19 -07:00
Wyatt Johnson f0572d1e34 Merge branch 'master' into events 2018-02-23 15:09:32 -07:00
Wyatt Johnson 894940cd0b replaced singleSlot with slotSize 2018-02-23 14:48:57 -07:00
Wyatt Johnson 105ed1454d added singleSlot on the commentContent 2018-02-23 14:35:48 -07:00
Wyatt Johnson 1a9f9c2056 added support for the singleSlot 2018-02-23 14:32:52 -07:00
Wyatt Johnson 8ce0b784e2 added comment 2018-02-23 14:32:29 -07:00
Wyatt Johnson 22c876fa02 introduced some safety checks 2018-02-23 14:02:44 -07:00
Wyatt Johnson 735ecbcef3 linting updates 2018-02-23 14:00:07 -07:00
Wyatt Johnson 37dc3a27dc updated yarn.lock after merge conflict 2018-02-23 13:58:42 -07:00
Wyatt Johnson 12a1ed0de3 Merge branch 'master' into rte-plugin 2018-02-23 13:58:21 -07:00
Kim Gardner eb0265bbb3 Merge pull request #1400 from coralproject/pregit
pre-commit linting
2018-02-23 15:55:19 -05:00
Wyatt Johnson 36438c7f38 Merge branch 'master' into pregit 2018-02-23 13:17:20 -07:00
Wyatt Johnson bd08debb40 Merge pull request #1401 from coralproject/account-history-patches
Account history
2018-02-23 13:17:07 -07:00
Kim Gardner 7e41619732 Update new translation keys 2018-02-23 14:54:45 -05:00
Wyatt Johnson c869869436 Merge branch 'master' into account-history-patches 2018-02-23 12:33:05 -07:00
Wyatt Johnson 8b4fe46120 added support for new system icon 2018-02-23 12:32:49 -07:00
Kim Gardner 1707cd7d98 Merge branch 'master' into pregit 2018-02-23 14:30:57 -05:00
Wyatt Johnson 23e71221a6 Merge branch 'master' into rte-plugin 2018-02-23 12:20:50 -07:00
Wyatt Johnson c12b3ca2b2 Merge pull request #1395 from nikoferro/quiet-logs
issue #1022 - quiet logs on production mode
2018-02-23 12:17:24 -07:00
okbel 4fe3d582b8 commentBox slot 2018-02-23 15:55:32 -03:00
Wyatt Johnson ecf040ebf7 Merge branch 'master' into quiet-logs 2018-02-23 11:55:25 -07:00
okbel 632f80a202 Readme for talk-rich-text-pell 2018-02-23 15:54:34 -03:00
Wyatt Johnson 025c82a6cc migrated pregit linting 2018-02-23 11:48:44 -07:00
okbel 02374345e1 Adding README.md, modifying mutation, changing htmlBody to richTextBody to make it generic 2018-02-23 15:35:14 -03:00
Wyatt Johnson 627170a970 Updated server version 2018-02-23 11:31:20 -07:00
Kim Gardner 3a04e492c2 Merge pull request #1398 from mkonikov/patch-2
Fix typos
2018-02-23 12:53:03 -05:00
okbel e45b09b32a Adding support for links! 2018-02-23 14:52:20 -03:00
Wyatt Johnson fa3373ec94 added docs to workspace 2018-02-23 10:34:52 -07:00
Wyatt Johnson 5baa20b06f Merge branch 'master' into post-message 2018-02-23 10:30:07 -07:00
Kim Gardner 8571fdc957 Merge branch 'master' into patch-2 2018-02-23 12:27:32 -05:00
Kim Gardner 25f4f8c1c8 Merge pull request #1397 from mkonikov/patch-1
Typos in comments
2018-02-23 12:17:33 -05:00
Mendel Konikov 69117f2fa5 Fixed one more typo
And once we're going all out, capitalized ;)
2018-02-23 12:01:56 -05:00
okbel 9b5c0c2ca7 classNames 2018-02-23 13:50:00 -03:00
okbel e6832dc2b4 classNames 2018-02-23 13:23:08 -03:00
okbel 7422575aba Initializing purifier config 2018-02-23 13:16:00 -03:00
Mendel Konikov 820087f49c Fix typos 2018-02-23 11:12:34 -05:00
okbel 907ffea1f9 Adding strict and secure rules for html injection and jsom config 2018-02-23 13:06:56 -03:00
okbel d6818366ec yarn locks 2018-02-23 12:40:44 -03:00
okbel 912ccd6dd9 Adding a plugin for the backend and a plugin for the frontend 2018-02-23 12:38:33 -03:00
okbel ab3133c8aa Merge branch 'rte-plugin' of github.com:coralproject/talk into rte-plugin
* 'rte-plugin' of github.com:coralproject/talk:
  moved lock file
  updated plugin reconciler, replaced docker commands
  Rm accident added file
  Fix CI
  added advisory excemption
  replaced custom loading with yarn workspaces
  Implement profile settings
  Refactor Profile
  add Google auth plugin
2018-02-23 12:30:45 -03:00
okbel 2f5c4906f7 Adding DOM Sanitizer 2018-02-23 12:29:30 -03:00
Mendel Konikov 898e28fe1b Typos in comments 2018-02-23 08:27:21 -05:00
Wyatt Johnson 139d036b42 changed styles + added translations 2018-02-22 17:32:37 -07:00
Wyatt Johnson 0406fe7d1c cleaned up notifications manager 2018-02-22 17:19:02 -07:00
Wyatt Johnson cbf33b29fb fixed permission bug 2018-02-22 17:18:42 -07:00
Belén Curcio 322740bda0 Merge branch 'master' into rte-plugin 2018-02-22 21:15:27 -03:00
Nicolas Ferro e33ccb57b6 invoke console warning through window to prevent from being discarded on prod 2018-02-22 21:00:55 -03:00
Wyatt Johnson 9ce94c97d0 merged lockfiles 2018-02-22 16:03:28 -07:00
Wyatt Johnson 31c643e4eb Merge branch 'master' into events 2018-02-22 16:02:07 -07:00
Wyatt Johnson 0a3acbc7ba added linting rules 2018-02-22 15:49:13 -07:00
Wyatt Johnson ec285dc87a Merge branch 'master' into docs 2018-02-22 15:40:06 -07:00
Nicolas Ferro a3e2448f25 Merge branch 'quiet-logs' of https://github.com/nikoferro/talk into quiet-logs 2018-02-22 19:34:53 -03:00
Nicolas Ferro 855e972bec fix pre-commit errors 2018-02-22 19:34:33 -03:00
Nicolas Ferro 361dc6c441 Merge branch 'master' into quiet-logs 2018-02-22 19:25:51 -03:00
Nicolas Ferro 083b8638e8 issue #1022 - quiet logs on production mode 2018-02-22 19:17:26 -03:00
Wyatt Johnson b649fe3071 Merge branch 'master' into post-message 2018-02-22 15:14:21 -07:00
Wyatt Johnson 011a6e6465 Merge pull request #1390 from coralproject/workspaces
Yarn Workspaces
2018-02-22 15:09:32 -07:00
Wyatt Johnson 6a46703e98 added sessionStorage fallback 2018-02-22 15:08:59 -07:00
Wyatt Johnson 2485386b45 moved lock file 2018-02-22 14:29:56 -07:00
Wyatt Johnson 5bba2ea0ae updated plugin reconciler, replaced docker commands 2018-02-22 14:27:14 -07:00
Wyatt Johnson fd53de94a1 linting 2018-02-22 14:24:54 -07:00
Wyatt Johnson 26a660248e replaced localStorage state events with postMessage 2018-02-22 14:22:58 -07:00
Wyatt Johnson 8c9bf5d4c8 Merge branch 'master' into workspaces 2018-02-22 14:10:33 -07:00
Wyatt Johnson fa96531eab Merge pull request #1373 from kitwestneat/plugin-google-auth
add Google auth plugin
2018-02-22 14:05:43 -07:00
Kim Gardner e7f96bd04c Merge branch 'master' into rte-plugin 2018-02-22 13:44:00 -05:00
Wyatt Johnson 2aa043d39a Merge branch 'master' into plugin-google-auth 2018-02-22 10:09:35 -07:00
Kim Gardner 03fe54c68e Merge branch 'master' into workspaces 2018-02-22 12:06:00 -05:00
Kim Gardner 24b3980423 Merge pull request #1383 from coralproject/refactor-profile
Profile Tab Pane and Profile Settings
2018-02-22 10:12:54 -05:00
okbel 91e7dadfda Removed unused dependencies and yarn.lock updated 2018-02-22 12:08:23 -03:00
okbel 1bca2a96e5 Updating the store - Fully Working 🎉 2018-02-22 11:46:10 -03:00
okbel 2f4c084811 Comment previous edit 2018-02-22 11:24:37 -03:00
okbel 4579537709 Enabling metadata for comment edition 2018-02-22 10:34:22 -03:00
okbel 6f6fe69129 Handling edited comments data 2018-02-22 08:59:21 -03:00
Chi Vinh Le 57b9b2f70e Refactor toggle 2018-02-22 12:10:46 +01:00
Chi Vinh Le 7c676e8926 Implement styling 2018-02-22 11:28:10 +01:00
Chi Vinh Le d268e2d3e4 Fix import path 2018-02-22 10:47:40 +01:00
Chi Vinh Le 15425f3e49 Merge branch 'refactor-profile' into events 2018-02-22 10:47:31 +01:00
Chi Vinh Le 4d943629d9 Rm accident added file 2018-02-22 10:47:13 +01:00
Chi Vinh Le 7ad0575e6d Merge branch 'refactor-profile' into events 2018-02-22 10:39:07 +01:00
Chi Vinh Le 60620951cf Merge branch 'events' of ssh://github.com/coralproject/talk into events 2018-02-22 10:39:02 +01:00
Chi Vinh Le 7dd63dc812 Fix CI 2018-02-22 10:38:18 +01:00
Chi Vinh Le b79a07275f Rename fragment 2018-02-22 10:24:44 +01:00
okbel 6eb442d59a Adding optimistic response, and responses 2018-02-21 19:07:39 -03:00
okbel 62eb77fa4b Adding Slot 2018-02-21 17:16:18 -03:00
okbel 46a1857abe Comment Content renderer 2018-02-21 17:08:39 -03:00
okbel 38352e9e3c Using metadata to store html comment 2018-02-21 16:59:02 -03:00
Wyatt Johnson 9098537838 removed console.log 2018-02-21 12:42:30 -07:00
Wyatt Johnson ab7cfffa50 improved mailer 2018-02-21 12:40:37 -07:00
okbel bf1bae8999 Support for both htmlBody and original body 2018-02-21 16:37:19 -03:00
Wyatt Johnson eb86fdbd11 mail cleanup 2018-02-21 11:43:19 -07:00
Chi Vinh Le 9ca237f49d Merge branch 'events' of ssh://github.com/coralproject/talk into events 2018-02-21 18:06:02 +01:00
Chi Vinh Le 6935330536 Implemented notification frontend functionality 2018-02-21 18:03:46 +01:00
Wyatt Johnson 60af5135ca Merge branch 'master' into plugin-google-auth 2018-02-21 09:50:30 -07:00
okbel 9cfa5b6a0f Removing old styles from default css 2018-02-21 11:15:23 -03:00
okbel 50748cc032 Updating onChange 2018-02-21 10:45:54 -03:00
okbel 7d7a5a8b59 Buttons styling 2018-02-21 10:43:10 -03:00
okbel d7b4f57350 styles, renaming, func 2018-02-21 10:27:01 -03:00
okbel 8258ccde9b RTE Plugin - Editor working 2018-02-21 10:13:13 -03:00
okbel 096c9a4894 Adding rte plugin 🎉 2018-02-21 09:26:39 -03:00
okbel e895413038 Adding new Slot, adding default component 2018-02-21 09:25:25 -03:00
Wyatt Johnson cb266e651b spelling 2018-02-20 21:47:16 -07:00
Wyatt Johnson b6fa8b92a1 Merge branch 'master' into events 2018-02-20 21:46:41 -07:00
Wyatt Johnson 85f3598e99 added advisory excemption 2018-02-20 21:45:35 -07:00
Wyatt Johnson e5f6188bd2 replaced custom loading with yarn workspaces 2018-02-20 21:39:32 -07:00
Wyatt Johnson 7e2e29c947 updated config 2018-02-20 17:57:40 -07:00
Wyatt Johnson 7404962741 embedded graph docs into static docs 2018-02-20 15:59:44 -07:00
Kim Gardner 8080994975 Merge branch 'master' into refactor-profile 2018-02-20 15:14:12 -05:00
Kim Gardner e8e8b007e3 Merge pull request #1382 from coralproject/account-h-until
Adding suspension and ban support for duration in hours and days
2018-02-20 15:13:48 -05:00
Wyatt Johnson 2bb56290c4 fixed bug in template 2018-02-20 12:40:24 -07:00
Wyatt Johnson 9426f280cc Update router.js 2018-02-20 12:27:47 -07:00
Kiwi 6a5c643ef2 Merge branch 'master' into refactor-profile 2018-02-20 19:57:59 +01:00
Wyatt Johnson 22ee7b1d34 fixed docs 2018-02-20 11:34:26 -07:00
Kim Gardner 234c705f35 Merge branch 'master' into account-h-until 2018-02-20 12:47:16 -05:00
Wyatt Johnson 74d38f16ed Merge pull request #1388 from coralproject/bump-version-4-2-2
Update version to 4.2.2
2018-02-20 10:27:14 -07:00
Kiwi a7e9936671 Merge branch 'master' into refactor-profile 2018-02-20 18:24:18 +01:00
Belén Curcio 9617948493 Merge branch 'master' into account-h-until 2018-02-20 14:03:22 -03:00
Wyatt Johnson 7129896bd6 Merge branch 'master' into bump-version-4-2-2 2018-02-20 09:57:12 -07:00
Wyatt Johnson e2e718494c Merge pull request #1387 from coralproject/action-fixes
Action Count Fixes
2018-02-20 09:57:05 -07:00
Chi Vinh Le 284009df55 WIP 2018-02-20 17:54:44 +01:00
Kim Gardner f918bbea20 Update version to 4.2.2 2018-02-20 11:45:36 -05:00
Wyatt Johnson 4467f6110f Merge branch 'master' into action-fixes 2018-02-20 09:44:00 -07:00
Wyatt Johnson a166404347 fix for action count null 2018-02-20 09:31:08 -07:00
Kim Gardner 34922a6d42 Merge branch 'master' into account-h-until 2018-02-20 10:56:40 -05:00
Kim Gardner 3d2f3ebc59 Merge pull request #1384 from coralproject/user-tooltip-style
Making the User Info Tooltip more readable and friendly
2018-02-20 10:56:04 -05:00
Kim Gardner c4cdc672b7 Merge branch 'master' into user-tooltip-style 2018-02-20 10:44:15 -05:00
Kim Gardner b84a488518 Merge pull request #1380 from leeeandroo/facebook-translations
Fix translations keys and add german translations to facebook plugin
2018-02-20 10:44:05 -05:00
Kim Gardner 8b4b1728bc Merge branch 'master' into account-h-until 2018-02-20 10:38:14 -05:00
Kim Gardner 233c514251 Fix small typo 2018-02-20 10:37:36 -05:00
Kim Gardner 4b134cbfc2 Merge branch 'master' into facebook-translations 2018-02-20 10:34:22 -05:00
Kim Gardner c446098a1e Merge branch 'master' into user-tooltip-style 2018-02-20 10:24:00 -05:00
Kim Gardner a9e8f390b8 Merge branch 'master' into plugin-google-auth 2018-02-20 10:23:05 -05:00
Kim Gardner b26e938ac5 Merge pull request #1381 from leeeandroo/package-version421
set a right last release 4.2.1 to package.json
2018-02-20 10:22:09 -05:00
Chi Vinh Le ee04d9a848 Merge branch 'refactor-profile' into events 2018-02-20 15:12:43 +01:00
Chi Vinh Le 0ca8b978a1 Implement profile settings 2018-02-20 13:21:02 +01:00
okbel 846df0a5e0 trim dates, style tooltip 2018-02-19 12:27:55 -03:00
okbel e7934d9468 trim dates, style tooltip 2018-02-19 12:23:36 -03:00
Chi Vinh Le 3deb56750f Merge branch 'refactor-profile' into events 2018-02-19 16:20:02 +01:00
okbel 12497a1331 Adding duration asHours and asDays 2018-02-19 12:07:57 -03:00
Chi Vinh Le 45dde4636d Merge branch 'master' into refactor-profile 2018-02-19 16:06:42 +01:00
Chi Vinh Le 8c2070e345 Refactor Profile 2018-02-19 16:04:43 +01:00
Leandro 606d5734f9 set a right last release 4.2.1 to package.json 2018-02-19 11:18:56 +01:00
Leandro 87ff631eed fix translations keys and add germna translations to facebook plugin 2018-02-19 09:50:07 +01:00
Kim Gardner 43d4db085b Merge branch 'master' into plugin-google-auth 2018-02-16 19:22:02 -05:00
Wyatt Johnson b600172380 fixed import cycle 2018-02-16 17:11:02 -07:00
Wyatt Johnson 0b547b173a Merge branch 'master' into events 2018-02-16 16:43:03 -07:00
Kit Westneat 499a7fe686 add Google auth plugin 2018-02-16 18:17:34 -05:00
Wyatt Johnson 91aeb9dbae fixes based on feedback 2018-02-16 16:08:05 -07:00
Wyatt Johnson 9a89dfaa29 fixed test 2018-02-16 15:48:38 -07:00
Wyatt Johnson 634da8012f Merge branch 'master' into events 2018-02-16 15:47:37 -07:00
Wyatt Johnson 4c06d5659d initial rewrite 2018-02-16 13:31:37 -07:00
Wyatt Johnson 181d258b5e lint 2018-02-15 10:57:54 -07:00
Wyatt Johnson 36e855237f replaced json -> hjson loader 2018-02-15 10:47:36 -07:00
Wyatt Johnson 376ffd8486 fixed runtime errors 2018-02-15 10:23:27 -07:00
Chi Vinh Le 214d9e5047 Add changes 2018-02-15 17:34:47 +01:00
Wyatt Johnson a867b27f53 emails loaded from graph
- introduced graphql method on context
- mailer will try to load the email from the graph
2018-02-14 17:10:20 -07:00
Wyatt Johnson 28a348f2cc Merge branch 'master' into events 2018-02-12 19:39:16 -07:00
Wyatt Johnson 6c1667d80b patched test 2018-02-12 19:11:28 -07:00
Wyatt Johnson 5d1eff0ddb added mutations 2018-02-12 19:02:27 -07:00
Wyatt Johnson 5221ebbe9a added docs, added new logger 2018-02-12 16:51:39 -07:00
Wyatt Johnson 79cb8b0fb2 Merge branch 'master' into events 2018-02-09 18:36:34 -07:00
Wyatt Johnson 90290cfa2d patched bug 2018-02-09 18:33:13 -07:00
Wyatt Johnson 8b669a31c5 initial notification draft
- implements new notification manager using connect api
- first use case of plugins using the plugin api
2018-02-09 18:17:25 -07:00
Wyatt Johnson aaa1e0dbc3 enhanced mailer
- added template system for dynamic re-registration of email templates
- permitted no-auth based smtp schemes (to support inbucket)
- added helper registration for dynamic components in the templates
2018-02-09 18:00:37 -07:00
Wyatt Johnson eab1e6ca59 refactored resolvers, cleaned 2018-02-09 18:00:12 -07:00
Wyatt Johnson b758dc91cb added new plugin hook for connectors 2018-02-07 10:03:06 -07:00
Wyatt Johnson cdf3c44083 Merge branch 'master' into events 2018-02-06 14:33:57 -07:00
Wyatt Johnson 26cba9af63 Merge branch 'master' into events 2018-02-06 14:31:07 -07:00
Wyatt Johnson 5815d869b5 Merge branch 'master' into events 2018-01-31 12:58:53 -07:00
Wyatt Johnson c15cff7121 subscription refactor 2018-01-31 09:55:54 -07:00
Wyatt Johnson f8f882fbfd blocked user actions in username change process 2018-01-30 15:22:09 -07:00
Kim Gardner 931fb81aa8 Update version to 4.1.0 and update LICENSE 2018-01-30 15:22:09 -07:00
Wyatt Johnson cf4e817e79 Merge branch 'master' into events 2018-01-30 11:04:42 -07:00
Wyatt Johnson a06f76fd4c removed events 2018-01-29 16:36:54 -07:00
Morten Nissen f47abfc3ad Merge pull request #2 from coralproject/master
update master
2017-12-29 22:18:44 +01:00
Morten Nissen 275fbf4c5a Merge pull request #1 from coralproject/master
Updating master
2017-10-19 19:18:00 +02:00
737 changed files with 21537 additions and 6355 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"presets": [
["es2015", {modules: false}]
["es2015", {"modules": false}]
],
"plugins": [
"transform-class-properties",
+300
View File
@@ -0,0 +1,300 @@
# job_defaults applies all the defaults for each job.
job_defaults: &job_defaults
working_directory: ~/coralproject/talk
docker:
- image: circleci/node:8
# integration_environment is the environment that configures the tests.
integration_environment: &integration_environment
NODE_ENV: test
CIRCLE_TEST_REPORTS: /tmp/circleci-test-results
E2E_MAX_RETRIES: 3
# integration_job runs the integration tests and saves the test results.
integration_job: &integration_job
<<: *job_defaults
environment:
<<: *integration_environment
docker:
# TODO: replace with node:8-browsers when build issues are resolved.
# - image: circleci/node:8-browsers
- image: coralproject/ci
- image: circleci/mongo:3
- image: circleci/redis:4-alpine
steps:
- checkout
- attach_workspace:
at: ~/coralproject/talk
- run:
name: Setup the database with defaults
command: ./bin/cli setup --defaults
- run:
name: Run the integration tests
command: bash .circleci/e2e.sh
- store_test_results:
when: always
path: /tmp/circleci-test-results
- store_artifacts:
when: always
path: /tmp/circleci-test-results
version: 2
jobs:
# npm_dependencies will install the dependencies used by all other steps.
npm_dependencies:
<<: *job_defaults
steps:
- checkout
- attach_workspace:
at: ~/coralproject/talk
- restore_cache:
key: dependency-cache-{{ checksum "yarn.lock" }}
- run:
name: Install dependencies
command: |
yarn global add node-gyp &&
yarn install --frozen-lockfile
- save_cache:
key: dependency-cache-{{ checksum "yarn.lock" }}
paths:
- ./node_modules
- persist_to_workspace:
root: .
paths: node_modules
# lint will perform file linting.
lint:
<<: *job_defaults
steps:
- checkout
- attach_workspace:
at: ~/coralproject/talk
- run:
name: Perform linting
command: yarn lint
# build_assets will build the static assets.
build_assets:
<<: *job_defaults
steps:
- checkout
- attach_workspace:
at: ~/coralproject/talk
- restore_cache:
keys:
- build-cache-{{ .Branch }}-{{ .Revision }}
- build-cache-{{ .Branch }}-
- build-cache-
- run:
name: Build static assets
command: yarn build
- save_cache:
key: build-cache-{{ .Branch }}-{{ .Revision }}
paths:
- ./node_modules/.cache/babel-loader
- persist_to_workspace:
root: .
paths: dist
# test_unit will run the unit tests.
test_unit:
<<: *job_defaults
docker:
- image: circleci/node:8
- image: circleci/mongo:3
- image: circleci/redis:4-alpine
steps:
- checkout
- attach_workspace:
at: ~/coralproject/talk
- run:
name: Setup the test results directory
command: mkdir -p /tmp/circleci-test-results
- run:
name: Run the client unit tests
command: yarn test:client --ci
environment:
JEST_JUNIT_OUTPUT: /tmp/circleci-test-results/jest/test-results.xml
JEST_REPORTER: jest-junit
- run:
name: Run the server unit tests
command: yarn test:server
environment:
MOCHA_FILE: /tmp/circleci-test-results/mocha/test-results.xml
MOCHA_REPORTER: mocha-junit-reporter
- store_test_results:
when: always
path: /tmp/circleci-test-results
# test_integration_chrome_local will run the integration tests locally with
# chrome headless.
test_integration_chrome_local:
<<: *integration_job
environment:
<<: *integration_environment
E2E_BROWSERS: chrome
# test_integration_firefox_local will run the integration tests locally with
# firefox headless.
test_integration_firefox_local:
<<: *integration_job
environment:
<<: *integration_environment
E2E_BROWSERS: firefox
# test_integration_chrome will run the integration tests with chrome in
# browserstack.
test_integration_chrome:
<<: *integration_job
environment:
<<: *integration_environment
BROWSERSTACK: true
E2E_BROWSERS: chrome
# test_integration_firefox will run the integration tests with firefox in
# browserstack.
test_integration_firefox:
<<: *integration_job
environment:
<<: *integration_environment
BROWSERSTACK: true
E2E_BROWSERS: firefox
# test_integration_edge will run the integration tests with edge in
# browserstack.
test_integration_edge:
<<: *integration_job
environment:
<<: *integration_environment
BROWSERSTACK: true
E2E_BROWSERS: edge
# test_integration_ie will run the integration tests with ie in
# browserstack.
test_integration_ie:
<<: *integration_job
environment:
<<: *integration_environment
BROWSERSTACK: true
E2E_BROWSERS: ie
# TODO: remove when more reliable
E2E_MAX_RETRIES: 1
# test_integration_safari will run the integration tests with safari in
# browserstack.
test_integration_safari:
<<: *integration_job
environment:
<<: *integration_environment
BROWSERSTACK: true
E2E_BROWSERS: safari
# TODO: remove when more reliable
E2E_MAX_RETRIES: 1
# deploy will deploy the application as a docker image.
deploy:
<<: *job_defaults
steps:
- checkout
- setup_remote_docker
- run:
name: Deploy the code
command: bash ./scripts/docker.sh deploy
# filter_deploy will add the filters for a deploy job in a workflow to make it
# only execute on a deploy related job.
filter_deploy: &filter_deploy
filters:
branches:
only:
- master
- next
tags:
only: /v[0-9]+(\.[0-9]+)*/
# filter_develop will add the filters for a development related commit.
filter_develop: &filter_develop
filters:
branches:
ignore:
- master
- next
workflows:
version: 2
# All PR's will hit this workflow.
build-and-test:
jobs:
- npm_dependencies:
<<: *filter_develop
- lint:
<<: *filter_develop
requires:
- npm_dependencies
- test_unit:
<<: *filter_develop
requires:
- npm_dependencies
- build_assets:
<<: *filter_develop
requires:
- npm_dependencies
- test_integration_chrome_local:
<<: *filter_develop
requires:
- build_assets
# TODO: uncomment when more reliable
# - test_integration_firefox_local:
# <<: *filter_develop
# requires:
# - build_assets
deploy-tagged:
jobs:
- npm_dependencies:
<<: *filter_deploy
- lint:
<<: *filter_deploy
requires:
- npm_dependencies
- test_unit:
<<: *filter_deploy
requires:
- npm_dependencies
- build_assets:
<<: *filter_deploy
requires:
- npm_dependencies
- test_integration_chrome:
<<: *filter_deploy
requires:
- build_assets
- test_integration_firefox:
<<: *filter_deploy
requires:
- build_assets
- test_integration_edge:
<<: *filter_deploy
requires:
- build_assets
# TODO: uncomment when more reliable
# - test_integration_ie:
# <<: *filter_deploy
# requires:
# - build_assets
# - test_integration_safari:
# <<: *filter_deploy
# requires:
# - build_assets
- deploy:
<<: *filter_deploy
requires:
- lint
- test_unit
- test_integration_chrome
- test_integration_firefox
- test_integration_edge
# TODO: uncomment when more reliable
# - test_integration_ie
# - test_integration_safari
+4 -4
View File
@@ -19,11 +19,11 @@ if [[ "${E2E_DISABLE}" == "true" ]]; then
exit
fi
if [[ "${CIRCLE_BRANCH}" == "master" && -n "$BROWSERSTACK_KEY" ]]; then
if [[ "$BROWSERSTACK" == "true" && -n "$BROWSERSTACK_KEY" ]]; then
echo Testing on browserstack
yarn e2e --reports-folder "$REPORTS_FOLDER" --bs-key "$BROWSERSTACK_KEY" --retries "$E2E_MAX_RETRIES" --timeout "$E2E_WAIT_FOR_TIMEOUT" --browsers "$E2E_BROWSERS"
node scripts/e2e.js --reports-folder "$REPORTS_FOLDER" --retries "$E2E_MAX_RETRIES" --timeout "$E2E_WAIT_FOR_TIMEOUT" --browsers "$E2E_BROWSERS" --browserstack
else
# When browserstack is not available test locally using chrome headless.
# When browserstack is not available test locally.
echo Testing locally
yarn e2e --reports-folder "$REPORTS_FOLDER" --retries "$E2E_MAX_RETRIES" --headless
node scripts/e2e.js --reports-folder "$REPORTS_FOLDER" --retries "$E2E_MAX_RETRIES" --timeout "$E2E_WAIT_FOR_TIMEOUT" --browsers "$E2E_BROWSERS" --headless
fi
+1 -30
View File
@@ -1,34 +1,5 @@
**/*.html
dist
docs
node_modules
plugins/*
public
!plugins/talk-plugin-akismet
!plugins/talk-plugin-auth
!plugins/talk-plugin-author-menu
!plugins/talk-plugin-comment-content
!plugins/talk-plugin-deep-reply-count
!plugins/talk-plugin-facebook-auth
!plugins/talk-plugin-featured-comments
!plugins/talk-plugin-flag-details
!plugins/talk-plugin-ignore-user
!plugins/talk-plugin-like
!plugins/talk-plugin-love
!plugins/talk-plugin-member-since
!plugins/talk-plugin-mod
!plugins/talk-plugin-moderation-actions
!plugins/talk-plugin-offtopic
!plugins/talk-plugin-permalink
!plugins/talk-plugin-remember-sort
!plugins/talk-plugin-respect
!plugins/talk-plugin-sort-most-liked
!plugins/talk-plugin-sort-most-loved
!plugins/talk-plugin-sort-most-replied
!plugins/talk-plugin-sort-most-respected
!plugins/talk-plugin-sort-newest
!plugins/talk-plugin-sort-oldest
!plugins/talk-plugin-subscriber
!plugins/talk-plugin-toxic-comments
!plugins/talk-plugin-viewing-options
**/*.min.js
+32 -3
View File
@@ -1,5 +1,34 @@
### Expected behavior
<!--
### Actual behavior
Thank you for filing an issue on Coral Talk!
### Steps to reproduce behavior
Please fill out the questions below so we can take action on your issue as soon as we can.
If you're filing a feature request, you do not need to follow the outline below. Instead please include "Feature Idea" in your issue title and explain a specific example in which that feature would be useful.
-->
#### Do you want to request a **feature** or report a **bug**?
#### Intended outcome:
<!--
What you were trying to accomplish when the bug occurred?
-->
#### Actual outcome:
<!--
What happened instead?
Please provide as much detail as possible, including a screenshot or copy-paste of any related error messages, logs, or other output that might be related. Places to look for information include your browser console, server console, and network logs. The more information you can give the better.
-->
#### How to reproduce the issue:
<!--
Instructions for how the issue can be reproduced by someone from our team or by a contributor. Be as specific as possible, and only mention what is necessary to reproduce the bug. If possible, try to isolate the exact circumstances in which the bug occurs and avoid speculation over what the cause might be.
-->
#### Version and environment
<!--
List what version of Talk you're using, as well as any other relevant environment information, such as operating system or browser
-->
+36 -21
View File
@@ -6,6 +6,7 @@ npm-debug.log*
dump.rdb
client/coral-framework/graphql/introspection.json
docs/source/_data/introspection.json
.env
*.cfg
@@ -14,6 +15,7 @@ client/coral-framework/graphql/introspection.json
*.swp
*.DS_STORE
.prettierrc.json
.vscode
coverage/
test/e2e/reports/
@@ -22,36 +24,49 @@ test/e2e/selenium-debug.log
browserstack.err
plugins.json
plugins/*
!plugins/talk-plugin-akismet
!plugins/talk-plugin-facebook-auth
!plugins/talk-plugin-auth
!plugins/talk-plugin-respect
!plugins/talk-plugin-offtopic
!plugins/talk-plugin-like
!plugins/talk-plugin-mod
!plugins/talk-plugin-love
!plugins/talk-plugin-viewing-options
!plugins/talk-plugin-author-menu
!plugins/talk-plugin-comment-content
!plugins/talk-plugin-permalink
!plugins/talk-plugin-deep-reply-count
!plugins/talk-plugin-downvote
!plugins/talk-plugin-facebook-auth
!plugins/talk-plugin-featured-comments
!plugins/talk-plugin-toxic-comments
!plugins/talk-plugin-sort-newest
!plugins/talk-plugin-sort-oldest
!plugins/talk-plugin-sort-most-replied
!plugins/talk-plugin-flag-details
!plugins/talk-plugin-google-auth
!plugins/talk-plugin-ignore-user
!plugins/talk-plugin-like
!plugins/talk-plugin-love
!plugins/talk-plugin-member-since
!plugins/talk-plugin-mod
!plugins/talk-plugin-moderation-actions
!plugins/talk-plugin-notifications
!plugins/talk-plugin-notifications-category-featured
!plugins/talk-plugin-notifications-category-reply
!plugins/talk-plugin-notifications-category-staff
!plugins/talk-plugin-notifications-digest-daily
!plugins/talk-plugin-notifications-digest-hourly
!plugins/talk-plugin-offtopic
!plugins/talk-plugin-permalink
!plugins/talk-plugin-profile-settings
!plugins/talk-plugin-remember-sort
!plugins/talk-plugin-respect
!plugins/talk-plugin-slack-notifications
!plugins/talk-plugin-sort-most-downvoted
!plugins/talk-plugin-sort-most-liked
!plugins/talk-plugin-sort-most-loved
!plugins/talk-plugin-sort-most-replied
!plugins/talk-plugin-sort-most-respected
!plugins/talk-plugin-author-menu
!plugins/talk-plugin-member-since
!plugins/talk-plugin-ignore-user
!plugins/talk-plugin-moderation-actions
!plugins/talk-plugin-toxic-comments
!plugins/talk-plugin-remember-sort
!plugins/talk-plugin-deep-reply-count
!plugins/talk-plugin-sort-most-upvoted
!plugins/talk-plugin-sort-newest
!plugins/talk-plugin-sort-oldest
!plugins/talk-plugin-subscriber
!plugins/talk-plugin-flag-details
!plugins/talk-plugin-slack-notifications
!plugins/talk-plugin-toxic-comments
!plugins/talk-plugin-upvote
!plugins/talk-plugin-viewing-options
!plugins/talk-plugin-rich-text
**/node_modules/*
yarn-error.log
+13
View File
@@ -0,0 +1,13 @@
{
"linters": {
"*.js": [
"git-exec-and-restage eslint --fix --"
],
"bin/cli*": [
"git-exec-and-restage eslint --fix --"
],
"*.yml": [
"yamllint"
]
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"exec": "npm-run-all --parallel generate-introspection start:development",
"ignore": ["test/*", "client/*", "dist/*", "plugins/*/client"],
"ignore": ["test/*", "client/*", "dist/*", "plugins/*/client", "docs/*"],
"ext": "js,json,graphql,yml",
"watch": [
".",
+2 -1
View File
@@ -1,6 +1,7 @@
{
"exceptions": [
"https://nodesecurity.io/advisories/531",
"https://nodesecurity.io/advisories/532"
"https://nodesecurity.io/advisories/532",
"https://nodesecurity.io/advisories/566"
]
}
+3 -3
View File
@@ -54,12 +54,12 @@ We are looking for _documentarians_ to:
* take the lead in making sections, or the over all structure better.
Our documentation is stored in markdown files in the [docs](docs) directory. We
use Jekyll to provide our docs. To preview:
use [Hexo](https://hexo.io/) to provide our docs. To preview:
```shell
cd docs
bundle install
bundle exec jekyll serve
yarn
yarn start
```
Then visit http://127.0.0.1:4000/talk/.
+4 -1
View File
@@ -15,10 +15,13 @@ COPY . /usr/src/app
# Ensure the runtime of the container is in production mode.
ENV NODE_ENV production
# Store the current git revision.
ARG REVISION_HASH
ENV REVISION_HASH=${REVISION_HASH}
# Install app dependencies and build static assets.
RUN yarn global add node-gyp && \
yarn install --frozen-lockfile && \
cli plugins reconcile && \
yarn build && \
yarn cache clean
+1
View File
@@ -18,5 +18,6 @@ ONBUILD COPY . /usr/src/app
# clear out the development dependencies again. After this we of course need to
# clear out the yarn cache, this saves quite a lot of size.
ONBUILD RUN cli plugins reconcile && \
yarn && \
yarn build && \
yarn cache clean
+9 -5
View File
@@ -1,4 +1,4 @@
# Talk &middot; [![CircleCI](https://circleci.com/gh/coralproject/talk.svg?style=svg)](https://circleci.com/gh/coralproject/talk) &middot; [![NSP Status](https://nodesecurity.io/orgs/coralproject/projects/07ce2e4c-99fb-48f8-b50b-69d2d2c081b8/badge)](https://nodesecurity.io/orgs/coralproject/projects/07ce2e4c-99fb-48f8-b50b-69d2d2c081b8) &middot; [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md#pull-requests)
# Talk &middot; [![CircleCI](https://circleci.com/gh/coralproject/talk.svg?style=svg)](https://circleci.com/gh/coralproject/talk) &middot; [![NSP Status](https://nodesecurity.io/orgs/coralproject/projects/7bd7d26c-47ed-4a5f-8c4a-b919bf1c2946/badge)](https://nodesecurity.io/orgs/coralproject/projects/7bd7d26c-47ed-4a5f-8c4a-b919bf1c2946) &middot; [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md#pull-requests)
Online comments are broken. Our open-source commenting platform, Talk, rethinks how moderation, comment display, and conversation function, creating the opportunity for safer, smarter discussions around your work. [Read more about Talk here](https://coralproject.net/products/talk.html).
@@ -12,19 +12,23 @@ You're just one click away from trying Talk - all you need is a Heroku account a
## Technical Documentation
From getting up and running, to advanced configuration, to how to scale Talk, our [Talk Technical Docs](https://coralproject.github.io/talk/) have everything you need to know.
From getting up and running, to advanced configuration, to how to scale Talk, our [Talk Technical Docs](https://docs.coralproject.net/talk/) have everything you need to know.
## Product Guide
Learn more about Talk, including a deep dive into features for commenters and moderators, and FAQs in our [Talk Product Guide](https://coralproject.github.io/talk/how-talk-works).
Learn more about Talk, including a deep dive into features for commenters and moderators, and FAQs in our [Talk Product Guide](https://docs.coralproject.net/talk/how-talk-works).
## Relevant Links
## Pre-Launch Guide
Youve installed Talk on your server, and youre preparing to launch it on your site. The real community work starts now, before you go live. You have a unique opportunity pre-launch to set your community up for success. Read our [Talk Community Guide](https://blog.coralproject.net/youve-installed-talk-now-what/).
## More Resources
- [Talk Product Roadmap](https://www.pivotaltracker.com/n/projects/1863625)
- [Our Blog](https://blog.coralproject.net/)
- [Community Forums](https://community.coralproject.net/)
- [Community Guides for Journalism](https://guides.coralproject.net/)
- [More About Us](https://coralproject.net/)
- [Talk Roadmap](https://www.pivotaltracker.com/n/projects/1863625)
## End-to-End Testing
+6 -9
View File
@@ -1,7 +1,7 @@
const express = require('express');
const morgan = require('morgan');
const trace = require('./middleware/trace');
const logging = require('./middleware/logging');
const path = require('path');
const uuid = require('uuid');
const merge = require('lodash/merge');
const helmet = require('helmet');
const plugins = require('./services/plugins');
@@ -13,12 +13,9 @@ const { ENABLE_TRACING, APOLLO_ENGINE_KEY, PORT } = require('./config');
const app = express();
// Request Identity Middleware
app.use((req, res, next) => {
req.id = uuid.v4();
next();
});
// Add the trace middleware first, it will create a request ID for each request
// downstream.
app.use(trace);
//==============================================================================
// PLUGIN PRE APPLICATION MIDDLEWARE
@@ -38,7 +35,7 @@ plugins.get('server', 'app').forEach(({ plugin, app: callback }) => {
// Add the logging middleware only if we aren't testing.
if (process.env.NODE_ENV !== 'test') {
app.use(morgan('dev'));
app.use(logging.log);
}
if (ENABLE_TRACING && APOLLO_ENGINE_KEY) {
+19 -13
View File
@@ -13,6 +13,7 @@ const CommentModel = require('../models/comment');
const AssetsService = require('../services/assets');
const mongoose = require('../services/mongoose');
const scraper = require('../services/scraper');
const Context = require('../graph/context');
const inquirer = require('inquirer');
const { URL } = require('url');
@@ -52,22 +53,27 @@ async function refreshAssets(ageString) {
const ageMs = parseDuration(ageString);
const age = new Date(now - ageMs);
let assets = await AssetModel.find({
$or: [
{
scraped: {
$lte: age,
let assets = await AssetModel.find(
{
$or: [
{
scraped: {
$lte: age,
},
},
},
{
scraped: null,
},
],
});
{
scraped: null,
},
],
},
{ id: 1 }
);
// Create a graph context.
const ctx = Context.forSystem();
// Queue all the assets for scraping.
await Promise.all(assets.map(scraper.create));
await Promise.all(assets.map(({ id }) => scraper.create(ctx, id)));
console.log('Assets were queued to be scraped');
util.shutdown();
} catch (e) {
+3 -7
View File
@@ -6,8 +6,7 @@
const util = require('./util');
const program = require('commander');
const scraper = require('../services/scraper');
const mailer = require('../services/mailer');
const jobs = require('../jobs');
const mongoose = require('../services/mongoose');
const kue = require('../services/kue');
@@ -21,11 +20,8 @@ function processJobs() {
// started.
util.onshutdown([() => kue.Task.shutdown()]);
// Start the scraper processor.
scraper.process();
// Start the mail processor.
mailer.process();
// Start the jobs processor.
jobs.process();
}
/**
+31 -98
View File
@@ -135,22 +135,15 @@ function reconcilePackages({ quiet = false, upgradeRemote = false }) {
return { local, fetchable, upgradable };
}
async function reconcileRemotePlugins({ skipLocal, dryRun, upgradeRemote }) {
console.log(
`\n[${skipLocal ? '1/2' : '2/3'}] ${emoji.get(
'mag'
)} Reconciling plugins...`.yellow
);
async function reconcileRemotePlugins({ dryRun, upgradeRemote }) {
console.log(`\n['1/2'] ${emoji.get('mag')} Reconciling plugins...`.yellow);
const { fetchable, upgradable } = reconcilePackages({ upgradeRemote });
console.log(
`[${skipLocal ? '2/2' : '3/3'}] ${emoji.get('truck')} Fetching plugins...\n`
.yellow
);
console.log(`['2/2'] ${emoji.get('truck')} Fetching plugins...\n`.yellow);
if (fetchable.length > 0) {
console.log(
`$ yarn add --ignore-scripts ${fetchable.map(
`$ yarn add --ignore-scripts --ignore-workspace-root-check ${fetchable.map(
({ name, version }) => `${name}@${version}`.cyan
)}`
);
@@ -159,6 +152,7 @@ async function reconcileRemotePlugins({ skipLocal, dryRun, upgradeRemote }) {
let args = [
'add',
'--ignore-scripts',
'--ignore-workspace-root-check',
...fetchable.map(({ name, version }) => `${name}@${version}`),
];
@@ -206,98 +200,41 @@ async function reconcileRemotePlugins({ skipLocal, dryRun, upgradeRemote }) {
return { upgradable, fetchable };
}
async function reconcileLocalPlugins({ skipRemote, dryRun }) {
console.log(
`\n[${skipRemote ? '1/1' : '1/3'}] ${emoji.get(
'pick'
)} Installing local plugin dependencies...\n`.yellow
);
const { local } = reconcilePackages({ quiet: true });
for (let i in local) {
let { name } = local[i];
if (!fs.existsSync(path.join(dir, 'plugins', name, 'package.json'))) {
continue;
}
let wd = path.join(dir, 'plugins', name);
console.log(`$ cd ${wd.cyan} && yarn`);
if (!dryRun) {
let args = [];
let output = spawn.sync('yarn', args, {
stdio: ['ignore', 'pipe', 'inherit'],
cwd: wd,
});
if (output.status) {
throw new Error(
'Could not install local plugin dependencies, errors occurred during install'
);
}
console.log(output.stdout.toString());
}
}
}
// This traverses the local plugins and installs any dependencies listed there,
// this only is really needed for plugins that are installed via docker because
// core plugins will have their dependencies already included in core.
async function reconcilePluginDeps({
skipLocal,
skipRemote,
dryRun,
upgradeRemote,
}) {
async function reconcilePluginDeps({ dryRun, upgradeRemote }) {
try {
let startTime = new Date();
// We don't need to do anything if we skip everything....
if (skipLocal && skipRemote) {
return;
}
// Traverse local plugins and install dependencies if enabled.
if (!skipLocal) {
await reconcileLocalPlugins({ skipRemote, dryRun });
}
// Locate any external plugins and install them.
if (!skipRemote) {
const results = await reconcileRemotePlugins({
skipLocal,
skipRemote,
dryRun,
upgradeRemote,
});
const results = await reconcileRemotePlugins({
dryRun,
upgradeRemote,
});
let status;
if (dryRun) {
status = '[dry-run] success'.green;
} else {
status = 'success'.green;
}
let message;
if (results.upgradable.length === 0 && results.fetchable.length === 0) {
message = 'Already up-to-date.';
} else if (results.upgradable.length === 0) {
message = `Fetched ${results.fetchable.length} new plugins.`;
} else if (results.fetchable.length === 0) {
message = `Upgraded ${results.upgradable.length} new plugins.`;
} else {
message = `Fetched ${results.fetchable.length} new plugins, upgraded ${
results.upgradable.length
} plugins.`;
}
console.log(`\n${status} ${message}`);
let status;
if (dryRun) {
status = '[dry-run] success'.green;
} else {
status = 'success'.green;
}
let message;
if (results.upgradable.length === 0 && results.fetchable.length === 0) {
message = 'Already up-to-date.';
} else if (results.upgradable.length === 0) {
message = `Fetched ${results.fetchable.length} new plugins.`;
} else if (results.fetchable.length === 0) {
message = `Upgraded ${results.upgradable.length} new plugins.`;
} else {
message = `Fetched ${results.fetchable.length} new plugins, upgraded ${
results.upgradable.length
} plugins.`;
}
console.log(`\n${status} ${message}`);
let endTime = new Date();
let totalTime = ((endTime.getTime() - startTime.getTime()) / 1000).toFixed(
@@ -440,16 +377,12 @@ program
program
.command('reconcile')
.description(
'reconciles local plugin dependencies and downloads external plugins'
)
.description('reconciles dependencies by downloading external plugins')
.option('-u, --upgrade-remote', 'upgrades remote dependencies')
.option(
'-d, --dry-run',
'does not actually change anything on the filesystem acts only as a simulation'
)
.option('--skip-local', 'skips the local dependancy reconciliation')
.option('--skip-remote', 'skips the remote plugin reconciliation')
.action(reconcilePluginDeps);
program.parse(process.argv);
+7 -1
View File
@@ -10,6 +10,12 @@ const serve = require('../serve');
program
.option('-j, --jobs', 'enable job processing on this thread')
.option(
'--disabled-jobs <jobs>',
'disable jobs specified if the -j option is passed, specified as a comma separated list',
val => val.split(','),
[]
)
.option(
'-w, --websockets',
'enable the websocket (subscriptions) handler on this thread'
@@ -17,7 +23,7 @@ program
.parse(process.argv);
// Start serving.
serve({ jobs: program.jobs, websockets: program.websockets }).catch(err => {
serve(program).catch(err => {
console.error(err);
util.shutdown(1);
});
+10 -6
View File
@@ -14,7 +14,8 @@ const SettingsService = require('../services/settings');
const SetupService = require('../services/setup');
const UsersService = require('../services/users');
const MigrationService = require('../services/migration');
const errors = require('../errors');
const { ErrSettingsInit, ErrSettingsNotInit } = require('../errors');
const Context = require('../graph/context');
// Register the shutdown criteria.
util.onshutdown([() => mongoose.disconnect()]);
@@ -40,13 +41,15 @@ const performSetup = async () => {
// We should NOT have gotten a settings object, this means that the
// application is already setup. Error out here.
throw errors.ErrSettingsInit;
} catch (e) {
throw new ErrSettingsInit();
} catch (err) {
// If the error is `not init`, then we're good, otherwise, it's something
// else.
if (e !== errors.ErrSettingsNotInit) {
throw e;
if (err instanceof ErrSettingsNotInit) {
return;
}
throw err;
}
if (program.defaults) {
@@ -184,7 +187,8 @@ const performSetup = async () => {
},
]);
let { user: newUser } = await SetupService.setup({
const ctx = Context.forSystem();
let { user: newUser } = await SetupService.setup(ctx, {
settings: settings.toObject(),
user: {
email: user.email,
+69 -75
View File
@@ -7,8 +7,6 @@
const util = require('./util');
const program = require('commander');
const inquirer = require('inquirer');
const { graphql } = require('graphql');
const helpers = require('../services/migration/helpers');
const { stripIndent } = require('common-tags');
const Table = require('cli-table');
@@ -21,31 +19,15 @@ inquirer.registerPrompt(
require('inquirer-autocomplete-prompt')
);
const schema = require('../graph/schema');
const Context = require('../graph/context');
const UsersService = require('../services/users');
const UserModel = require('../models/user');
const CommentModel = require('../models/comment');
const ActionModel = require('../models/action');
const USER_ROLES = require('../models/enum/user_roles');
const mongoose = require('../services/mongoose');
// Register the shutdown criteria.
util.onshutdown([() => mongoose.disconnect()]);
/**
* transforms a specific action to a removal action on the target model.
*/
const actionDecrTransformer = ({ item_id, action_type, group_id }) => ({
query: { id: item_id },
update: {
$inc: {
[`action_counts.${action_type.toLowerCase()}`]: -1,
[`action_counts.${action_type.toLowerCase()}_${group_id.toLowerCase()}`]: -1,
},
},
});
/**
* Deletes a user and cleans up their associated verifications.
*/
@@ -76,66 +58,29 @@ async function deleteUser(userID) {
return util.shutdown();
}
const { transformSingleWithCursor } = helpers({
queryBatchSize: 10000,
updateBatchSize: 10000,
});
const ctx = Context.forSystem();
console.warn("Removing user's actions");
// Remove all actions against comments.
await transformSingleWithCursor(
ActionModel.collection.find({ user_id: user.id, item_type: 'COMMENTS' }),
actionDecrTransformer,
CommentModel
const { data, errors } = await ctx.graphql(
`
mutation DeleteUser($user_id: ID!) {
delUser(id: $user_id) {
errors {
translation_key
}
}
}
`,
{ user_id: user.id }
);
if (errors) {
throw errors;
}
// Remove all actions against users.
await transformSingleWithCursor(
ActionModel.collection.find({ user_id: user.id, item_type: 'USERS' }),
actionDecrTransformer,
UserModel
);
if (data.errors) {
throw data.errors;
}
// Remove all the user's actions.
await ActionModel.where({ user_id: user.id })
.setOptions({ multi: true })
.remove();
console.warn("Removing user's comments");
// Removes all the user's reply counts on each of the comments that they
// have commented on.
await transformSingleWithCursor(
CommentModel.collection.aggregate([
{ $match: { author_id: user.id } },
{
$group: {
_id: '$parent_id',
count: { $sum: 1 },
},
},
]),
({ _id: parent_id, count }) => ({
query: { id: parent_id },
update: {
$inc: {
reply_count: -1 * count,
},
},
}),
CommentModel
);
// Remove all the user's comments.
await CommentModel.where({ author_id: user.id })
.setOptions({ multi: true })
.remove();
console.warn('Removing the user');
// Remove the user.
await user.remove();
console.log('User was deleted.');
util.shutdown();
} catch (err) {
@@ -197,7 +142,7 @@ async function searchUsers() {
value = '';
}
const { data, errors } = await graphql(schema, searchQuery, {}, ctx, {
const { data, errors } = await ctx.graphql(searchQuery, {
value,
});
if (errors && errors.length > 0) {
@@ -312,10 +257,59 @@ async function verifyUserEmail(userID, email) {
}
}
/**
* createUser will prompt the user for the user information when creating a
* local user.
*/
async function createUser() {
try {
const answers = await inquirer.prompt([
{
name: 'email',
message: 'Email',
},
{
name: 'username',
message: 'Username',
},
{
name: 'password',
message: 'Password',
type: 'password',
},
{
name: 'role',
message: 'Role',
type: 'list',
choices: USER_ROLES,
},
]);
const { email, username, password, role } = answers;
// Create the user.
const user = await UsersService.createLocalUser(email, password, username);
// Set the role.
await UsersService.setRole(user.id, role);
console.log(`Created User[${user.id}]`);
util.shutdown(0);
} catch (err) {
console.error(err);
util.shutdown(1);
}
}
//==============================================================================
// Setting up the program command line arguments.
//==============================================================================
program
.command('create')
.description('creates a local user')
.action(createUser);
program
.command('delete <userID>')
.description('delete a user')
@@ -12,7 +12,7 @@ class MyPluginComponent extends React.Component {
<small>
To read more about plugins check{' '}
<a href="https://coralproject.github.io/talk/plugins-client.html">
<a href="https://docs.coralproject.net/talk/plugins-client">
our docs and guides!
</a>
</small>
+1 -1
View File
@@ -13,7 +13,7 @@
};
```
To read more info on how to build client plugins. Please, go to: https://coralproject.github.io/talk/plugins-client.html
To read more info on how to build client plugins. Please, go to: https://docs.coralproject.net/talk/plugins-client
*/
import MyPluginComponent from './components/MyPluginComponent';
+5 -8
View File
@@ -2,6 +2,7 @@
require('../services/env');
const debug = require('debug')('talk:util');
const { uniq } = require('lodash');
const util = (module.exports = {});
@@ -23,11 +24,7 @@ util.shutdown = (defaultCode = 0, signal = null) => {
debug(`${util.toshutdown.length} jobs now being called`);
Promise.all(
util.toshutdown
.map(func => (func ? func(signal) : null))
.filter(func => func)
)
Promise.all(util.toshutdown.map(func => (func ? func(signal) : null)))
.then(() => {
debug('Shutdown complete, now exiting');
process.exit(defaultCode);
@@ -49,14 +46,14 @@ util.onshutdown = jobs => {
debug(`${jobs.length} jobs registered to be called during shutdown`);
// Add the new jobs to shutdown to the object reference.
util.toshutdown = util.toshutdown.concat(jobs);
util.toshutdown = uniq(util.toshutdown.concat(jobs));
};
// Attach to the SIGTERM + SIGINT handles to ensure a clean shutdown in the
// event that we have an external event. SIGUSR2 is called when the app is asked
// to be 'killed', same procedure here.
process.on('SIGTERM', () => util.shutdown(0, 'SIGTERM'));
process.on('SIGINT', () => util.shutdown(0, 'SIGINT'));
process.once('SIGTERM', () => util.shutdown(0, 'SIGTERM'));
process.once('SIGINT', () => util.shutdown(0, 'SIGINT'));
process.once('SIGUSR2', () => util.shutdown(0, 'SIGUSR2'));
// Makes the script crash on unhandled rejections instead of silently
-75
View File
@@ -1,75 +0,0 @@
machine:
node:
version: 8
services:
- docker
- redis
environment:
PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"
NODE_ENV: "test"
MOCHA_FILE: "${CIRCLE_TEST_REPORTS}/junit/test-results.xml"
MOCHA_REPORTER: "mocha-junit-reporter"
pre:
# TODO: use the following to add in support for MongoDB 3.4.
# # Upgrade the database version to 3.4.
# - sudo apt-get purge mongodb-org*
# - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
# - echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
# - sudo apt-get update
# - sudo apt-get install -y mongodb-org
# - sudo service mongod restart
# Force sync the time.
- date
- sudo service ntp stop
- sudo ntpdate -s time.nist.gov
- sudo service ntp start
- date
# Install chromium for e2e and remove old google-chrome
- sudo rm -rf /opt/google/chrome
- sudo rm -f /usr/bin/google-chrome*
- sudo apt-get update
- sudo apt-get install chromium-browser
dependencies:
override:
# Install node dependencies.
- yarn --version
- yarn global add node-gyp --force
- yarn
post:
# Build the static assets.
- yarn build
# Lint the project here, before tests are ran.
- yarn lint
database:
post:
# Initialize the settings in the database, this will create indicies for the
# database.
- ./bin/cli setup --defaults
- sleep 2
test:
override:
# Run the tests using the junit reporter.
- yarn test
# Run the end to end tests
- yarn e2e:ci
deployment:
release:
tag: /v[0-9]+(\.[0-9]+)*/
commands:
- bash ./scripts/docker.sh deploy
latest:
branch:
- master
- next
owner: coralproject
commands:
- bash ./scripts/docker.sh deploy
+14 -2
View File
@@ -2,10 +2,15 @@ import React from 'react';
import PropTypes from 'prop-types';
import { Router, Route, IndexRedirect, IndexRoute } from 'react-router';
import Configure from 'routes/Configure';
import Install from 'routes/Install';
import Stories from 'routes/Stories';
import Community from 'routes/Community';
import Configure from 'routes/Configure';
import StreamSettings from './routes/Configure/containers/StreamSettings';
import ModerationSettings from './routes/Configure/containers/ModerationSettings';
import TechSettings from './routes/Configure/containers/TechSettings';
import { ModerationLayout, Moderation } from 'routes/Moderation';
import Layout from 'containers/Layout';
@@ -15,7 +20,14 @@ const routes = (
<Route exact path="/admin/install" component={Install} />
<Route path="/admin" component={Layout}>
<IndexRedirect to="/admin/moderate" />
<Route path="configure" component={Configure} />
<Route path="configure" component={Configure}>
<Route path="stream" component={StreamSettings} />
<Route path="moderation" component={ModerationSettings} />
<Route path="tech" component={TechSettings} />
<IndexRedirect to="stream" />
</Route>
<Route path="stories" component={Stories} />
{/* Community Routes */}
+6 -2
View File
@@ -8,6 +8,10 @@ export const clearPending = () => {
return { type: actions.CLEAR_PENDING };
};
export const setActiveSection = section => {
return { type: actions.SET_ACTIVE_SECTION, section };
export const showSaveDialog = () => {
return { type: actions.SHOW_SAVE_DIALOG };
};
export const hideSaveDialog = () => {
return { type: actions.HIDE_SAVE_DIALOG };
};
+1 -8
View File
@@ -5,14 +5,7 @@ export const singleView = () => ({ type: actions.SINGLE_VIEW });
// hide shortcuts note
export const hideShortcutsNote = () => (dispatch, _, { localStorage }) => {
try {
if (localStorage) {
localStorage.setItem('coral:shortcutsNote', 'hide');
}
} catch (e) {
// above will fail in Safari private mode
}
localStorage.setItem('coral:shortcutsNote', 'hide');
dispatch({ type: actions.HIDE_SHORTCUTS_NOTE });
};
@@ -15,6 +15,10 @@
}
}
.username {
word-break: break-all;
}
.headerRowItem {
color: #595959;
font-weight: bold;
@@ -5,13 +5,16 @@ import styles from './AccountHistory.css';
import cn from 'classnames';
import flatten from 'lodash/flatten';
import orderBy from 'lodash/orderBy';
import has from 'lodash/has';
import moment from 'moment';
import t from 'coral-framework/services/i18n';
import { Icon } from 'coral-ui';
const buildUserHistory = (userState = {}) => {
return orderBy(
flatten(
Object.keys(userState.status)
.filter(k => k !== '__typename')
.filter(k => !k.startsWith('__'))
.map(k => userState.status[k].history)
),
'created_at',
@@ -19,25 +22,49 @@ const buildUserHistory = (userState = {}) => {
);
};
const buildActionResponse = (typename, until, status) => {
/** readableDuration returns a readable duration of the suspension/ban in hours or days
* @param {} startDate
* @param {} endDate
*/
const readableDuration = (startDate, endDate) => {
const dur = moment.duration(moment(endDate).diff(moment(startDate)));
const durAsDays = dur.asDays().toFixed(0);
const durAsHours = dur.asHours().toFixed(0);
return durAsHours > 23
? durAsDays > 1
? t('suspenduser.days', durAsDays)
: t('suspenduser.day', durAsDays)
: durAsHours > 1
? t('suspenduser.hours', durAsHours)
: t('suspenduser.hour', durAsHours);
};
const buildActionResponse = (typename, created_at, until, status) => {
switch (typename) {
case 'UsernameStatusHistory':
return `Username ${status}`;
return t('account_history.username_status', status);
case 'BannedStatusHistory':
return status ? 'User banned' : 'Ban removed';
return status
? t('account_history.user_banned')
: t('account_history.ban_removed');
case 'SuspensionStatusHistory':
return until ? 'Account Suspended' : 'Suspension removed';
return until
? t('account_history.suspended', readableDuration(created_at, until))
: t('account_history.suspension_removed');
default:
return '-';
}
};
const getModerationValue = (userId, assignedBy = {}) => {
if (assignedBy && userId !== assignedBy.id) {
return assignedBy.username;
}
return 'SYSTEM';
};
const getModerationValue = assignedBy =>
has(assignedBy, 'username') ? (
assignedBy.username
) : (
<span>
<Icon name="computer" /> {t('account_history.system')}
</span>
);
class AccountHistory extends React.Component {
render() {
@@ -52,9 +79,15 @@ class AccountHistory extends React.Component {
'talk-admin-account-history-header-row'
)}
>
<div className={styles.headerRowItem}>Date</div>
<div className={styles.headerRowItem}>Action</div>
<div className={styles.headerRowItem}>Moderation</div>
<div className={styles.headerRowItem}>
{t('account_history.date')}
</div>
<div className={styles.headerRowItem}>
{t('account_history.action')}
</div>
<div className={styles.headerRowItem}>
{t('account_history.taken_by')}
</div>
</div>
{userHistory.map(
({ __typename, created_at, assigned_by, until, status }) => (
@@ -77,15 +110,16 @@ class AccountHistory extends React.Component {
'talk-admin-account-history-row-status'
)}
>
{buildActionResponse(__typename, until, status)}
{buildActionResponse(__typename, created_at, until, status)}
</div>
<div
className={cn(
styles.item,
styles.username,
'talk-admin-account-history-row-assigned-by'
)}
>
{getModerationValue(user.id, assigned_by)}
{getModerationValue(assigned_by)}
</div>
</div>
)
@@ -25,37 +25,29 @@ class CommentDetails extends Component {
};
render() {
const { data, root, comment, clearHeightCache } = this.props;
const { root, comment, clearHeightCache } = this.props;
const { showDetail } = this.state;
const queryData = {
const slotPassthrough = {
clearHeightCache,
root,
comment,
more: showDetail,
};
return (
<div className={styles.root}>
<IfSlotIsNotEmpty
queryData={queryData}
slot={['adminCommentMoreDetails', 'adminCommentMoreFlagDetails']}
passthrough={slotPassthrough}
>
<a onClick={this.toggleDetail} className={styles.moreDetail}>
{showDetail ? t('modqueue.less_detail') : t('modqueue.more_detail')}
</a>
</IfSlotIsNotEmpty>
<Slot
fill="adminCommentDetailArea"
data={data}
clearHeightCache={clearHeightCache}
queryData={queryData}
more={showDetail}
/>
<Slot fill="adminCommentDetailArea" passthrough={slotPassthrough} />
{showDetail && (
<Slot
fill="adminCommentMoreDetails"
data={data}
clearHeightCache={clearHeightCache}
queryData={queryData}
/>
<Slot fill="adminCommentMoreDetails" passthrough={slotPassthrough} />
)}
</div>
);
@@ -63,7 +55,6 @@ class CommentDetails extends Component {
}
CommentDetails.propTypes = {
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
comment: PropTypes.object.isRequired,
clearHeightCache: PropTypes.func,
@@ -1,109 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import { matchLinks } from '../utils';
import memoize from 'lodash/memoize';
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
// generate a regulare expression that catches the `phrases`.
function generateRegExp(phrases) {
const inner = phrases
.map(phrase =>
phrase
.split(/\s+/)
.map(word => escapeRegExp(word))
.join('[\\s"?!.]+')
)
.join('|');
const pattern = `(^|[^\\w])(${inner})(?=[^\\w]|$)`;
try {
return new RegExp(pattern, 'iu');
} catch (_err) {
// IE does not support unicode support, so we'll create one without.
return new RegExp(pattern, 'i');
}
}
// Generate a regular expression detecting `suspectWords` and `bannedWords` phrases.
function getPhrasesRegexp(suspectWords, bannedWords) {
return generateRegExp([...suspectWords, ...bannedWords]);
}
// Memoized version as arguments rarely change.
const getPhrasesRegexpMemoized = memoize(getPhrasesRegexp);
// markPhrases looks for `supsectWords` and `bannedWords` inside `body` and highlights them by returning
// an array of React Elements.
function markPhrases(body, suspectWords, bannedWords, keyPrefix) {
const regexp = getPhrasesRegexpMemoized(suspectWords, bannedWords);
const tokens = body.split(regexp);
return tokens.map(
(token, i) =>
i % 3 === 2 ? <mark key={`${keyPrefix}_${i}`}>{token}</mark> : token
);
}
// markLinks looks for links inside `body` and highlights them by returning
// an array of React Elements.
function markLinks(body) {
const matches = matchLinks(body);
const content = [];
let index = 0;
if (matches) {
matches.forEach((match, i) => {
content.push(body.substring(index, match.index));
content.push(<mark key={i}>{match.text}</mark>);
index = match.lastIndex;
});
}
content.push(body.substring(index));
return content;
}
const CommentFormatter = ({
body,
suspectWords,
bannedWords,
className = 'comment',
...rest
}) => {
// Breaking the body by line break
const textbreaks = body.split('\n');
return (
<span className={`${className}-text`} {...rest}>
{textbreaks.map((line, i) => {
const content = markLinks(line).map((element, index) => {
// Keep highlighted links.
if (typeof element !== 'string') {
return element;
}
// Highlight suspect and banned phrase inside this part of text.
return markPhrases(element, suspectWords, bannedWords, index);
});
return (
<span key={i} className={`${className}-line`}>
{content}
{i !== textbreaks.length - 1 && (
<br className={`${className}-linebreak`} />
)}
</span>
);
})}
</span>
);
};
CommentFormatter.propTypes = {
className: PropTypes.string,
bannedWords: PropTypes.array,
suspectWords: PropTypes.array,
body: PropTypes.string,
};
export default CommentFormatter;
@@ -43,6 +43,9 @@ const CommentLabels = ({
comment,
comment: { className, status, actions, hasParent },
}) => {
const slotPassthrough = {
comment,
};
return (
<div className={cn(className, styles.root)}>
<div className={styles.coreLabels}>
@@ -69,7 +72,7 @@ const CommentLabels = ({
<Slot
className={styles.slot}
fill="adminCommentLabels"
queryData={{ comment }}
passthrough={slotPassthrough}
/>
</div>
);
@@ -0,0 +1,8 @@
.container {
max-width: 1280px;
margin: 0 auto;
}
.copy {
padding: 20px 0;
}
@@ -0,0 +1,13 @@
import React from 'react';
import styles from './Forbidden.css';
const Forbidden = () => (
<div className={styles.container}>
<p className={styles.copy}>
This page is for team use only. Please contact an administrator if you
want to join this team.
</p>
</div>
);
export default Forbidden;
@@ -1,5 +1,5 @@
import React from 'react';
import { matchLinks } from '../utils';
import matchLinks from 'coral-framework/utils/matchLinks';
export default ({ text, children }) => {
const hasLinks = !!matchLinks(text);
+3 -1
View File
@@ -1,4 +1,6 @@
.layout {
margin: 0 auto;
background-color: #FAFAFA;
}
height: inherit;
min-height: calc(100vh - 58px);
}
@@ -98,7 +98,6 @@ class UserDetail extends React.Component {
renderLoaded() {
const {
data,
root,
root: { me, user, totalComments, rejectedComments },
activeTab,
@@ -123,6 +122,11 @@ class UserDetail extends React.Component {
const banned = isBanned(user);
const suspended = isSuspended(user);
const slotPassthrough = {
root,
user,
};
return (
<ClickOutside onClickOutside={modal ? null : hideUserDetail}>
<Drawer
@@ -244,11 +248,7 @@ class UserDetail extends React.Component {
</ul>
</div>
<Slot
fill="userProfile"
data={this.props.data}
queryData={{ root, user }}
/>
<Slot fill="userProfile" passthrough={slotPassthrough} />
<hr />
@@ -301,7 +301,6 @@ class UserDetail extends React.Component {
<UserDetailCommentList
user={user}
root={root}
data={data}
loadMore={loadMore}
toggleSelect={toggleSelect}
viewUserDetail={viewUserDetail}
@@ -320,7 +319,6 @@ class UserDetail extends React.Component {
<UserDetailCommentList
user={user}
root={root}
data={data}
loadMore={loadMore}
toggleSelect={toggleSelect}
viewUserDetail={viewUserDetail}
@@ -368,9 +366,7 @@ UserDetail.propTypes = {
bulkReject: PropTypes.func.isRequired,
toggleSelectAll: PropTypes.func.isRequired,
loading: PropTypes.bool.isRequired,
data: PropTypes.shape({
refetch: PropTypes.func.isRequired,
}),
data: PropTypes.object,
activeTab: PropTypes.string.isRequired,
selectedCommentIds: PropTypes.array.isRequired,
viewUserDetail: PropTypes.any.isRequired,
@@ -78,6 +78,12 @@
font-weight: 300;
font-size: 16px;
max-width: 360px;
blockquote {
font-size: inherit;
line-height: inherit;
letter-spacing: inherit;
}
}
.sideActions {
@@ -1,11 +1,11 @@
import React from 'react';
import PropTypes from 'prop-types';
import Slot from 'coral-framework/components/Slot';
import { Link } from 'react-router';
import { Icon } from 'coral-ui';
import CommentDetails from './CommentDetails';
import styles from './UserDetailComment.css';
import CommentFormatter from 'coral-admin/src/components/CommentFormatter';
import AdminCommentContent from 'coral-framework/components/AdminCommentContent';
import IfHasLink from 'coral-admin/src/components/IfHasLink';
import cn from 'classnames';
import CommentAnimatedEdit from './CommentAnimatedEdit';
@@ -32,10 +32,17 @@ class UserDetailComment extends React.Component {
selected,
toggleSelect,
className,
data,
root: { settings: { wordlist: { banned, suspect } } },
root: { settings },
} = this.props;
const slotPassthrough = {
root,
comment,
suspectWords: settings.wordlist.suspect,
bannedWords: settings.wordlist.banned,
body: comment.body,
};
return (
<li
tabIndex={0}
@@ -68,7 +75,8 @@ class UserDetailComment extends React.Component {
</div>
</div>
<div className={styles.story}>
Story: {comment.asset.title}
{t('common.story')}:{' '}
{comment.asset.title ? comment.asset.title : comment.asset.url}
{
<Link to={`/admin/moderate/${comment.asset.id}`}>
{t('modqueue.moderate')}
@@ -78,11 +86,15 @@ class UserDetailComment extends React.Component {
<CommentAnimatedEdit body={comment.body}>
<div className={styles.bodyContainer}>
<div className={styles.body}>
<CommentFormatter
suspectWords={suspect}
bannedWords={banned}
body={comment.body}
className="talk-admin-user-detail-comment"
<Slot
fill="userDetailCommentContent"
className={cn(
styles.commentContent,
'talk-admin-user-detail-comment'
)}
size={1}
defaultComponent={AdminCommentContent}
passthrough={slotPassthrough}
/>
<a
className={styles.external}
@@ -95,6 +107,7 @@ class UserDetailComment extends React.Component {
<div className={styles.sideActions}>
<IfHasLink text={comment.body}>
<span className={styles.hasLinks}>
{/* TODO: translate string */}
<Icon name="error_outline" /> Contains Link
</span>
</IfHasLink>
@@ -114,7 +127,7 @@ class UserDetailComment extends React.Component {
</div>
</CommentAnimatedEdit>
</div>
<CommentDetails data={data} root={root} comment={comment} />
<CommentDetails root={root} comment={comment} />
</li>
);
}
@@ -122,7 +135,6 @@ class UserDetailComment extends React.Component {
UserDetailComment.propTypes = {
selected: PropTypes.bool,
data: PropTypes.object,
user: PropTypes.object.isRequired,
viewUserDetail: PropTypes.func.isRequired,
acceptComment: PropTypes.func.isRequired,
@@ -9,7 +9,6 @@ import ApproveButton from './ApproveButton';
const UserDetailCommentList = props => {
const {
data,
root,
root: { user, comments: { nodes, hasNextPage } },
acceptComment,
@@ -70,7 +69,6 @@ const UserDetailCommentList = props => {
key={comment.id}
user={user}
root={root}
data={data}
comment={comment}
acceptComment={acceptComment}
rejectComment={rejectComment}
@@ -93,7 +91,6 @@ UserDetailCommentList.propTypes = {
root: PropTypes.object.isRequired,
acceptComment: PropTypes.func.isRequired,
rejectComment: PropTypes.func.isRequired,
data: PropTypes.object.isRequired,
selectedCommentIds: PropTypes.array.isRequired,
viewUserDetail: PropTypes.any.isRequired,
loadMore: PropTypes.any.isRequired,
@@ -28,8 +28,8 @@
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.2);
z-index: 10;
top: 32px;
right: 0px;
width: 140px;
left: -100px;
width: 200px;
text-align: left;
color: #616161;
}
@@ -39,7 +39,7 @@
border: 10px solid transparent;
border-top-color: #999;
position: absolute;
right: 0px;
left: 96px;
top: -20px;
transform: rotate(180deg);
}
@@ -49,7 +49,7 @@
border: 10px solid transparent;
border-top-color: white;
position: absolute;
right: 0px;
left: 96px;
top: -19px;
transform: rotate(180deg);
}
@@ -67,7 +67,7 @@ class UserInfoTooltip extends React.Component {
new Date(
this.getLastHistoryItem(user, 'banned').created_at
)
).format('MMMM Do YYYY, h:mm:ss a')}
).format('MMM Do YYYY, h:mm:ss a')}
</span>
</li>
<li
@@ -139,7 +139,7 @@ class UserInfoTooltip extends React.Component {
'suspension'
).created_at
)
).format('MMMM Do YYYY, h:mm:ss a')}
).format('MMM Do YYYY, h:mm:ss a')}
</span>
</li>
<li
@@ -154,7 +154,7 @@ class UserInfoTooltip extends React.Component {
new Date(
this.getLastHistoryItem(user, 'suspension').until
)
).format('MMMM Do YYYY, h:mm:ss a')}
).format('MMM Do YYYY, h:mm:ss a')}
</span>
</li>
</ul>
@@ -2,4 +2,6 @@ const prefix = 'TALK_ADMIN_CONFIGURE';
export const UPDATE_PENDING = `${prefix}_UPDATE_PENDING`;
export const CLEAR_PENDING = `${prefix}_CLEAR_PENDING`;
export const SET_ACTIVE_SECTION = `${prefix}_SET_ACTIVE_SECTION`;
export const SHOW_SAVE_DIALOG = `${prefix}_SHOW_SAVE_DIALOG`;
export const HIDE_SAVE_DIALOG = `${prefix}_HIDE_SAVE_DIALOG`;
+2 -4
View File
@@ -11,6 +11,7 @@ import { logout } from 'coral-framework/actions/auth';
import { can } from 'coral-framework/services/perms';
import UserDetail from 'coral-admin/src/containers/UserDetail';
import PropTypes from 'prop-types';
import Forbidden from '../components/Forbidden';
class LayoutContainer extends React.Component {
render() {
@@ -47,10 +48,7 @@ class LayoutContainer extends React.Component {
} else {
return (
<Layout {...this.props} handleLogout={logout}>
<p>
This page is for team use only. Please contact an administrator if
you want to join this team.
</p>
<Forbidden />
</Layout>
);
}
@@ -4,6 +4,9 @@ import withFragments from 'coral-framework/hocs/withFragments';
import { getDefinitionName } from 'coral-framework/utils';
import CommentLabels from './CommentLabels';
import CommentDetails from './CommentDetails';
import { getSlotFragmentSpreads } from 'coral-framework/utils';
const slots = ['userDetailCommentContent'];
export default withFragments({
root: gql`
@@ -14,6 +17,7 @@ export default withFragments({
suspect
}
}
${getSlotFragmentSpreads(slots, 'root')}
...${getDefinitionName(CommentLabels.fragments.root)}
...${getDefinitionName(CommentDetails.fragments.root)}
}
@@ -38,6 +42,7 @@ export default withFragments({
status_history {
type
}
${getSlotFragmentSpreads(slots, 'comment')}
...${getDefinitionName(CommentLabels.fragments.comment)}
...${getDefinitionName(CommentDetails.fragments.comment)}
}
+2 -1
View File
@@ -15,7 +15,8 @@ import { hideShortcutsNote } from './actions/moderation';
smoothscroll.polyfill();
function init({ store, localStorage }) {
if (localStorage && localStorage.getItem('coral:shortcutsNote') === 'hide') {
const shouldHide = localStorage.getItem('coral:shortcutsNote') === 'hide';
if (shouldHide) {
store.dispatch(hideShortcutsNote());
}
}
+15 -6
View File
@@ -6,11 +6,23 @@ const initialState = {
canSave: false,
pending: {},
errors: {},
activeSection: 'stream',
saveDialog: false,
};
export default function configure(state = initialState, action) {
switch (action.type) {
case actions.SHOW_SAVE_DIALOG: {
return {
...state,
saveDialog: true,
};
}
case actions.HIDE_SAVE_DIALOG: {
return {
...state,
saveDialog: false,
};
}
case actions.UPDATE_PENDING: {
let next = state;
if (action.updater) {
@@ -40,11 +52,8 @@ export default function configure(state = initialState, action) {
pending: {},
canSave: false,
};
case actions.SET_ACTIVE_SECTION:
return {
...state,
activeSection: action.section,
};
default:
return state;
}
return state;
}
@@ -130,3 +130,12 @@ th.header:nth-child(2), th.header:nth-child(3) {
.loadMore {
margin-top: 24px;
}
.roleDropdown {
width: 150px;
}
.roleOption {
min-width: 100px;
}
@@ -200,24 +200,31 @@ class People extends React.Component {
</td>
<td className="mdl-data-table__cell--non-numeric">
<Dropdown
containerClassName="talk-admin-community-people-dd-role"
className={cn(
'talk-admin-community-people-dd-role',
styles.roleDropdown
)}
value={user.role}
placeholder={t('community.role')}
onChange={role => setUserRole(user.id, role)}
>
<Option
className={styles.roleOption}
value={COMMENTER}
label={t('community.commenter')}
/>
<Option
className={styles.roleOption}
value={STAFF}
label={t('community.staff')}
/>
<Option
className={styles.roleOption}
value={MODERATOR}
label={t('community.moderator')}
/>
<Option
className={styles.roleOption}
value={ADMIN}
label={t('community.admin')}
/>
@@ -1,50 +1,37 @@
import React, { Component } from 'react';
import { Button, List, Item } from 'coral-ui';
import styles from './Configure.css';
import StreamSettings from '../containers/StreamSettings';
import ModerationSettings from '../containers/ModerationSettings';
import TechSettings from '../containers/TechSettings';
import t from 'coral-framework/services/i18n';
import { can } from 'coral-framework/services/perms';
import React from 'react';
import PropTypes from 'prop-types';
import t from 'coral-framework/services/i18n';
import { Button, List, Item } from 'coral-ui';
import { can } from 'coral-framework/services/perms';
import styles from './Configure.css';
import SaveChangesDialog from './SaveChangesDialog';
export default class Configure extends Component {
getSectionComponent(section) {
switch (section) {
case 'stream':
return StreamSettings;
case 'moderation':
return ModerationSettings;
case 'tech':
return TechSettings;
}
throw new Error(`Unknown section ${section}`);
}
class Configure extends React.Component {
render() {
const {
currentUser,
canSave,
savePending,
setActiveSection,
activeSection,
} = this.props;
const SectionComponent = this.getSectionComponent(activeSection);
const { canSave, currentUser, root, savePending, settings } = this.props;
if (!can(currentUser, 'UPDATE_CONFIG')) {
return (
<p>
You must be an administrator to access config settings. Please find
the nearest Admin and ask them to level you up!
</p>
);
return <p>{t('configure.access_message')}</p>;
}
const passProps = {
root,
settings,
};
return (
<div className={styles.container}>
<SaveChangesDialog
saveDialog={this.props.saveDialog}
hideSaveDialog={this.props.hideSaveDialog}
saveChanges={this.props.saveChanges}
discardChanges={this.props.discardChanges}
/>
<div className={styles.leftColumn}>
<List onChange={setActiveSection} activeItem={activeSection}>
<List
onChange={this.props.handleSectionChange}
activeItem={this.props.activeSection}
>
<Item itemId="stream" icon="speaker_notes">
{t('configure.stream_settings')}
</Item>
@@ -74,11 +61,7 @@ export default class Configure extends Component {
</div>
</div>
<div className={styles.mainContent}>
<SectionComponent
data={this.props.data}
root={this.props.root}
settings={this.props.settings}
/>
{React.cloneElement(this.props.children, passProps)}
</div>
</div>
);
@@ -87,11 +70,17 @@ export default class Configure extends Component {
Configure.propTypes = {
savePending: PropTypes.func.isRequired,
saveChanges: PropTypes.func.isRequired,
discardChanges: PropTypes.func.isRequired,
currentUser: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
canSave: PropTypes.bool.isRequired,
setActiveSection: PropTypes.func.isRequired,
handleSectionChange: PropTypes.func.isRequired,
activeSection: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
saveDialog: PropTypes.bool,
hideSaveDialog: PropTypes.func.isRequired,
};
export default Configure;
@@ -52,7 +52,7 @@ class ModerationSettings extends React.Component {
};
render() {
const { settings, data, root, updatePending, errors } = this.props;
const { settings, slotPassthrough } = this.props;
return (
<ConfigurePage title={t('configure.moderation_settings')}>
@@ -82,13 +82,7 @@ class ModerationSettings extends React.Component {
suspectWords={settings.wordlist.suspect}
onChangeWordlist={this.updateWordlist}
/>
<Slot
fill="adminModerationSettings"
data={data}
queryData={{ root, settings }}
updatePending={updatePending}
errors={errors}
/>
<Slot fill="adminModerationSettings" passthrough={slotPassthrough} />
</ConfigurePage>
);
}
@@ -97,9 +91,8 @@ class ModerationSettings extends React.Component {
ModerationSettings.propTypes = {
updatePending: PropTypes.func.isRequired,
errors: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
slotPassthrough: PropTypes.object.isRequired,
};
export default ModerationSettings;
@@ -0,0 +1,40 @@
.buttonActions {
padding-top: 15px;
text-align: right;
}
.dialog {
padding: 25px;
min-width: 400px;
}
.close {
font-size: 20px;
line-height: 14px;
top: 10px;
right: 10px;
position: absolute;
display: block;
font-weight: bold;
color: #363636;
cursor: pointer;
}
.title {
font-size: 18px;
font-weight: 800;
margin-bottom: 20px;
}
.cancel {
color: #363636;
margin-right: 15px;
display: inline-block;
&:hover {
cursor: pointer;
}
}
.button {
margin-left: 5px;
}
@@ -0,0 +1,53 @@
import React from 'react';
import PropTypes from 'prop-types';
import cn from 'classnames';
import { Button, Dialog } from 'coral-ui';
import styles from './SaveChangesDialog.css';
import t from 'coral-framework/services/i18n';
const SaveChangesDialog = ({
saveDialog,
hideSaveDialog,
saveChanges,
discardChanges,
}) => (
<Dialog
className={cn(styles.dialog, 'talk-admin-configure-save-dialog')}
id="saveDialog"
open={saveDialog}
onCancel={hideSaveDialog}
>
<span className={styles.close} onClick={hideSaveDialog}>
×
</span>
<div className={styles.title}>
{t('configure.save_changes_dialog.unsaved_changes')}
</div>
{t('configure.save_changes_dialog.copy')}
<div
className={cn(
styles.buttonActions,
'talk-admin-configure-save-dialog-button-actions'
)}
>
<a className={styles.cancel} onClick={hideSaveDialog}>
Cancel
</a>
<Button onClick={discardChanges} className={styles.button}>
{t('configure.save_changes_dialog.discard')}
</Button>
<Button onClick={saveChanges} cStyle="green" className={styles.button}>
{t('configure.save_changes_dialog.save_settings')}
</Button>
</div>
</Dialog>
);
SaveChangesDialog.propTypes = {
saveDialog: PropTypes.bool.isRequired,
hideSaveDialog: PropTypes.func.isRequired,
saveChanges: PropTypes.func.isRequired,
discardChanges: PropTypes.func.isRequired,
};
export default SaveChangesDialog;
@@ -107,7 +107,7 @@ class StreamSettings extends React.Component {
};
render() {
const { settings, data, root, errors, updatePending } = this.props;
const { settings, slotPassthrough, errors } = this.props;
return (
<ConfigurePage title={t('configure.stream_settings')}>
@@ -220,13 +220,7 @@ class StreamSettings extends React.Component {
</div>
</ConfigureCard>
{/* the above card should be the last one if at all possible because of z-index issues with the selects */}
<Slot
fill="adminStreamSettings"
data={data}
queryData={{ root, settings }}
updatePending={updatePending}
errors={errors}
/>
<Slot fill="adminStreamSettings" passthrough={slotPassthrough} />
</ConfigurePage>
);
}
@@ -235,9 +229,8 @@ class StreamSettings extends React.Component {
StreamSettings.propTypes = {
updatePending: PropTypes.func.isRequired,
errors: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
slotPassthrough: PropTypes.object.isRequired,
};
export default StreamSettings;
@@ -34,7 +34,7 @@ class TechSettings extends React.Component {
};
render() {
const { settings, data, root, errors, updatePending } = this.props;
const { settings, slotPassthrough } = this.props;
return (
<ConfigurePage title={t('configure.tech_settings')}>
<Domainlist
@@ -50,13 +50,7 @@ class TechSettings extends React.Component {
onChange={this.updateCustomCssUrl}
/>
</ConfigureCard>
<Slot
fill="adminTechSettings"
data={data}
queryData={{ root, settings }}
updatePending={updatePending}
errors={errors}
/>
<Slot fill="adminTechSettings" passthrough={slotPassthrough} />
</ConfigurePage>
);
}
@@ -64,10 +58,9 @@ class TechSettings extends React.Component {
TechSettings.propTypes = {
updatePending: PropTypes.func.isRequired,
errors: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
slotPassthrough: PropTypes.object.isRequired,
errors: PropTypes.object,
};
export default TechSettings;
@@ -1,4 +1,4 @@
import React, { Component } from 'react';
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { compose, gql } from 'react-apollo';
@@ -10,15 +10,70 @@ import { getDefinitionName } from 'coral-framework/utils';
import StreamSettings from './StreamSettings';
import TechSettings from './TechSettings';
import ModerationSettings from './ModerationSettings';
import { clearPending, setActiveSection } from '../../../actions/configure';
import {
clearPending,
showSaveDialog,
hideSaveDialog,
} from '../../../actions/configure';
import Configure from '../components/Configure';
import { withRouter } from 'react-router';
class ConfigureContainer extends React.Component {
state = { nextRoute: '' };
class ConfigureContainer extends Component {
savePending = async () => {
await this.props.updateSettings(this.props.pending);
this.props.clearPending();
};
saveChanges = async () => {
await this.savePending();
this.props.hideSaveDialog();
this.gotoNextRoute();
};
discardChanges = async () => {
await this.props.clearPending();
this.props.hideSaveDialog();
this.gotoNextRoute();
};
gotoNextRoute = () => {
const { nextRoute } = this.state;
if (nextRoute) {
this.props.router.push(nextRoute);
this.setState({ nextRoute: '' });
}
};
handleSectionChange = async section => {
const nextRoute = `/admin/configure/${section}`;
if (this.shouldShowSaveDialog()) {
await this.setState({ nextRoute });
this.props.showSaveDialog();
} else {
// Just go to the section
this.props.router.push(nextRoute);
}
};
shouldShowSaveDialog = () => {
return !!Object.keys(this.props.pending).length;
};
routeLeave = ({ pathname }) => {
if (this.shouldShowSaveDialog()) {
this.setState({ nextRoute: pathname });
this.props.showSaveDialog();
return false;
}
};
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routeLeave);
}
render() {
if (this.props.data.error) {
return <div>{this.props.data.error.message}</div>;
@@ -30,15 +85,20 @@ class ConfigureContainer extends Component {
return (
<Configure
saveChanges={this.saveChanges}
discardChanges={this.discardChanges}
saveDialog={this.props.saveDialog}
activeSection={this.props.routes[3].path}
hideSaveDialog={this.props.hideSaveDialog}
canSave={this.props.canSave}
currentUser={this.props.currentUser}
data={this.props.data}
root={this.props.root}
settings={this.props.mergedSettings}
canSave={this.props.canSave}
handleSectionChange={this.handleSectionChange}
savePending={this.savePending}
setActiveSection={this.props.setActiveSection}
activeSection={this.props.activeSection}
/>
>
{this.props.children}
</Configure>
);
}
}
@@ -75,18 +135,21 @@ const mapStateToProps = state => ({
pending: state.configure.pending,
canSave: state.configure.canSave,
activeSection: state.configure.activeSection,
saveDialog: state.configure.saveDialog,
});
const mapDispatchToProps = dispatch =>
bindActionCreators(
{
clearPending,
setActiveSection,
showSaveDialog,
hideSaveDialog,
},
dispatch
);
export default compose(
withRouter,
connect(mapStateToProps, mapDispatchToProps),
withUpdateSettings,
withConfigureQuery,
@@ -94,14 +157,20 @@ export default compose(
)(ConfigureContainer);
ConfigureContainer.propTypes = {
activeSection: PropTypes.string,
updateSettings: PropTypes.func.isRequired,
clearPending: PropTypes.func.isRequired,
setActiveSection: PropTypes.func.isRequired,
showSaveDialog: PropTypes.func.isRequired,
hideSaveDialog: PropTypes.func.isRequired,
saveDialog: PropTypes.bool.isRequired,
currentUser: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
canSave: PropTypes.bool.isRequired,
pending: PropTypes.object.isRequired,
mergedSettings: PropTypes.object.isRequired,
activeSection: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
router: PropTypes.object,
route: PropTypes.object,
routes: PropTypes.array,
};
@@ -5,6 +5,7 @@ import ModerationSettings from '../components/ModerationSettings';
import withFragments from 'coral-framework/hocs/withFragments';
import { getSlotFragmentSpreads } from 'coral-framework/utils';
import { updatePending } from '../../../actions/configure';
import { mapProps } from 'recompose';
const slots = ['adminModerationSettings'];
@@ -41,5 +42,17 @@ export default compose(
}
`,
}),
connect(mapStateToProps, mapDispatchToProps)
connect(mapStateToProps, mapDispatchToProps),
mapProps(({ root, settings, updatePending, errors, ...rest }) => ({
slotPassthrough: {
root,
settings,
updatePending,
errors,
},
updatePending,
settings,
errors,
...rest,
}))
)(ModerationSettings);
@@ -5,6 +5,7 @@ import StreamSettings from '../components/StreamSettings';
import withFragments from 'coral-framework/hocs/withFragments';
import { getSlotFragmentSpreads } from 'coral-framework/utils';
import { updatePending } from '../../../actions/configure';
import { mapProps } from 'recompose';
const slots = ['adminStreamSettings'];
@@ -42,5 +43,17 @@ export default compose(
}
`,
}),
connect(mapStateToProps, mapDispatchToProps)
connect(mapStateToProps, mapDispatchToProps),
mapProps(({ root, settings, updatePending, errors, ...rest }) => ({
slotPassthrough: {
root,
settings,
updatePending,
errors,
},
updatePending,
settings,
errors,
...rest,
}))
)(StreamSettings);
@@ -5,6 +5,7 @@ import TechSettings from '../components/TechSettings';
import withFragments from 'coral-framework/hocs/withFragments';
import { getSlotFragmentSpreads } from 'coral-framework/utils';
import { updatePending } from '../../../actions/configure';
import { mapProps } from 'recompose';
const slots = ['adminTechSettings'];
@@ -38,5 +39,17 @@ export default compose(
}
`,
}),
connect(mapStateToProps, mapDispatchToProps)
connect(mapStateToProps, mapDispatchToProps),
mapProps(({ root, settings, updatePending, errors, ...rest }) => ({
slotPassthrough: {
root,
settings,
updatePending,
errors,
},
updatePending,
settings,
errors,
...rest,
}))
)(TechSettings);
@@ -10,12 +10,14 @@ const InitialStep = () => {
return (
<div className={cn(styles.step, styles.finalStep, 'talk-install-step-5')}>
<p>{t('install.final.description')}</p>
<Button raised>
<Link to="/admin">{t('install.final.launch')}</Link>
</Button>
<Button cStyle="black" raised>
<a href="http://coralproject.net">{t('install.final.close')}</a>
</Button>
<Link to="/admin">
<Button raised>{t('install.final.launch')}</Button>
</Link>
<a href="http://coralproject.net">
<Button cStyle="black" raised>
{t('install.final.close')}
</Button>
</a>
</div>
);
};
@@ -72,9 +72,9 @@
flex: 1;
color: black;
max-width: 500px;
word-wrap: break-word;
font-weight: 300;
font-size: 16px;
word-break: break-all;
}
.created {
@@ -133,7 +133,6 @@
color: #063b9a;
cursor: pointer;
font-weight: normal;
margin-left: 10px;
white-space: nowrap;
&:hover {
@@ -184,3 +183,17 @@
}
}
}
.commentContent {
display: flex;
blockquote {
font-size: inherit;
line-height: inherit;
letter-spacing: inherit;
}
}
.commentContentFooter {
flex: 1;
}
@@ -8,7 +8,7 @@ import styles from './Comment.css';
import CommentLabels from 'coral-admin/src/components/CommentLabels';
import CommentAnimatedEdit from 'coral-admin/src/components/CommentAnimatedEdit';
import Slot from 'coral-framework/components/Slot';
import CommentFormatter from 'coral-admin/src/components/CommentFormatter';
import AdminCommentContent from 'coral-framework/components/AdminCommentContent';
import IfHasLink from 'coral-admin/src/components/IfHasLink';
import cn from 'classnames';
import ApproveButton from 'coral-admin/src/components/ApproveButton';
@@ -53,7 +53,6 @@ class Comment extends React.Component {
comment,
selected,
className,
data,
root,
root: { settings },
currentAsset,
@@ -62,7 +61,19 @@ class Comment extends React.Component {
} = this.props;
const selectionStateCSS = selected ? 'mdl-shadow--16dp' : 'mdl-shadow--2dp';
const queryData = { root, comment, asset: comment.asset };
const formatterSettings = {
suspectWords: settings.wordlist.suspect,
bannedWords: settings.wordlist.banned,
body: comment.body,
};
const slotPassthrough = {
clearHeightCache,
root,
comment,
asset: comment.asset,
};
return (
<li
@@ -107,16 +118,15 @@ class Comment extends React.Component {
<CommentLabels comment={comment} />
<Slot
fill="adminCommentInfoBar"
data={data}
clearHeightCache={clearHeightCache}
queryData={queryData}
passthrough={slotPassthrough}
/>
</div>
</div>
</div>
<div className={styles.moderateArticle}>
Story: {comment.asset.title}
{t('common.story')}:{' '}
{comment.asset.title ? comment.asset.title : comment.asset.url}
{!currentAsset && (
<Link to={`/admin/moderate/${comment.asset.id}`}>
{t('modqueue.moderate')}
@@ -126,29 +136,28 @@ class Comment extends React.Component {
<CommentAnimatedEdit body={comment.body}>
<div className={styles.itemBody}>
<div className={styles.body}>
<CommentFormatter
suspectWords={settings.wordlist.suspect}
bannedWords={settings.wordlist.banned}
className="talk-admin-comment"
body={comment.body}
<Slot
fill="adminCommentContent"
className={cn(styles.commentContent, 'talk-admin-comment')}
size={1}
defaultComponent={AdminCommentContent}
passthrough={{ ...slotPassthrough, ...formatterSettings }}
/>
<a
className={styles.external}
href={`${comment.asset.url}?commentId=${comment.id}`}
target="_blank"
>
<Icon name="open_in_new" /> {t('comment.view_context')}
</a>
<div className={styles.commentContentFooter}>
<a
className={styles.external}
href={`${comment.asset.url}?commentId=${comment.id}`}
target="_blank"
>
<Icon name="open_in_new" /> {t('comment.view_context')}
</a>
</div>
</div>
<Slot
fill="adminCommentContent"
data={data}
clearHeightCache={clearHeightCache}
queryData={queryData}
/>
<div className={styles.sideActions}>
<IfHasLink text={comment.body}>
<span className={styles.hasLinks}>
{/* TODO: translate string */}
<Icon name="error_outline" /> Contains Link
</span>
</IfHasLink>
@@ -162,18 +171,12 @@ class Comment extends React.Component {
onClick={this.reject}
/>
</div>
<Slot
fill="adminSideActions"
data={data}
clearHeightCache={clearHeightCache}
queryData={queryData}
/>
<Slot fill="adminSideActions" passthrough={slotPassthrough} />
</div>
</div>
</CommentAnimatedEdit>
</div>
<CommentDetails
data={data}
root={root}
comment={comment}
clearHeightCache={clearHeightCache}
@@ -211,7 +214,6 @@ Comment.propTypes = {
id: PropTypes.string,
}),
}),
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
selected: PropTypes.bool,
};
@@ -126,7 +126,6 @@ class Moderation extends Component {
render() {
const {
root,
data,
moderation,
viewUserDetail,
activeTab,
@@ -148,6 +147,13 @@ class Moderation extends Component {
count: root[`${queue}Count`],
}));
const slotPassthrough = {
root,
asset,
activeTab,
handleCommentChange,
};
return (
<div>
<ModerationHeader
@@ -171,7 +177,6 @@ class Moderation extends Component {
/>
<ModerationQueue
key={`${activeTab}_${this.props.moderation.sortOrder}`}
data={this.props.data}
root={this.props.root}
currentAsset={asset}
comments={comments.nodes}
@@ -204,13 +209,7 @@ class Moderation extends Component {
closeSearch={this.closeSearch}
storySearchChange={this.props.storySearchChange}
/>
<Slot
data={data}
queryData={{ root, asset }}
activeTab={activeTab}
handleCommentChange={handleCommentChange}
fill="adminModeration"
/>
<Slot fill="adminModeration" passthrough={slotPassthrough} />
</div>
);
}
@@ -6,10 +6,6 @@
margin-top: 16px;
}
:global(html) {
height: inherit;
}
.list {
outline: none;
}
@@ -344,7 +344,6 @@ class ModerationQueue extends React.Component {
child = (
<div style={style}>
<Comment
data={this.props.data}
root={this.props.root}
comment={comment}
dangling={
@@ -408,7 +407,6 @@ class ModerationQueue extends React.Component {
return (
<div className={styles.root}>
<Comment
data={this.props.data}
root={this.props.root}
key={comment.id}
comment={comment}
@@ -476,7 +474,6 @@ ModerationQueue.propTypes = {
hasNextPage: PropTypes.bool,
comments: PropTypes.array,
activeTab: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
currentUserId: PropTypes.string.isRequired,
};
@@ -111,14 +111,14 @@ class IndicatorContainer extends Component {
return null;
}
const slotPassthrough = {
handleCommentChange: this.handleCommentChange,
};
return (
<span>
<Indicator />
<Slot
data={this.props.data}
handleCommentChange={this.handleCommentChange}
fill="adminModerationIndicator"
/>
<Slot fill="adminModerationIndicator" passthrough={slotPassthrough} />
</span>
);
}
@@ -89,3 +89,12 @@
display: inline-block;
}
}
.statusDropdown {
width: 150px;
}
.statusDropdownOption {
min-width: 100px;
}
@@ -22,11 +22,20 @@ class Stories extends Component {
const closed = !!(closedAt && new Date(closedAt).getTime() < Date.now());
return (
<Dropdown
className={styles.statusDropdown}
value={closed}
onChange={value => this.props.onStatusChange(value, id)}
>
<Option value={false} label={t('streams.open')} />
<Option value={true} label={t('streams.closed')} />
<Option
value={false}
label={t('streams.open')}
className={styles.statusDropdownOption}
/>
<Option
value={true}
label={t('streams.closed')}
className={styles.statusDropdownOption}
/>
</Dropdown>
);
};
-9
View File
@@ -1,12 +1,3 @@
import LinkifyIt from 'linkify-it';
import tlds from 'tlds';
const linkify = new LinkifyIt();
linkify.tlds(tlds);
export function matchLinks(text) {
return linkify.match(text);
}
export const isPremod = mod => mod === 'PRE';
export const getModPath = (type = 'all', assetId) =>
+30 -10
View File
@@ -1,14 +1,34 @@
import { HANDLE_SUCCESSFUL_LOGIN } from 'coral-framework/constants/auth';
import { getStaticConfiguration } from 'coral-framework/services/staticConfiguration';
import { createPostMessage } from 'coral-framework/services/postMessage';
document.addEventListener('DOMContentLoaded', () => {
// Get the auth element and parse it as JSON by decoding it.
const auth = document.getElementById('auth');
const doc = document.implementation.createHTMLDocument('');
doc.body.innerHTML = auth.innerText;
try {
const staticConfig = getStaticConfiguration();
const { STATIC_ORIGIN: origin } = staticConfig;
const postMessage = createPostMessage(origin);
// Set the item in localStorage.
localStorage.setItem('auth', doc.body.textContent);
// Get the auth element and parse it as JSON by decoding it.
const auth = document.getElementById('auth');
const doc = document.implementation.createHTMLDocument('');
doc.body.innerHTML = auth.innerText;
// Close the window.
setTimeout(() => {
window.close();
}, 50);
// Auth state is contained within the node.
const { err, data } = JSON.parse(doc.body.textContent);
if (err) {
// TODO: send back the error message.
console.error(err);
} else {
// The data will contain a user and a token.
const { user, token } = data;
// Send the state back.
postMessage.post(HANDLE_SUCCESSFUL_LOGIN, { user, token });
}
} finally {
// Always close the window.
setTimeout(() => {
window.close();
}, 50);
}
});
-8
View File
@@ -1,8 +0,0 @@
import React from 'react';
import { render } from 'react-dom';
import { GraphQLDocs } from 'graphql-docs';
import fetcher from './services/fetcher';
// Render the application into the DOM
render(<GraphQLDocs fetcher={fetcher} />, document.querySelector('#root'));
-10
View File
@@ -1,10 +0,0 @@
export default function fetcher(query) {
return fetch(`${window.location.origin}/api/v1/graph/ql`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ query }),
}).then(res => res.json());
}
@@ -1,75 +0,0 @@
import * as actions from '../constants/asset';
import { notify } from 'coral-framework/actions/notification';
import t from 'coral-framework/services/i18n';
export const fetchAssetRequest = () => ({ type: actions.FETCH_ASSET_REQUEST });
export const fetchAssetSuccess = asset => ({
type: actions.FETCH_ASSET_SUCCESS,
asset,
});
export const fetchAssetFailure = error => ({
type: actions.FETCH_ASSET_FAILURE,
error,
});
const updateAssetSettingsRequest = () => ({
type: actions.UPDATE_ASSET_SETTINGS_REQUEST,
});
const updateAssetSettingsSuccess = settings => ({
type: actions.UPDATE_ASSET_SETTINGS_SUCCESS,
settings,
});
const updateAssetSettingsFailure = error => ({
type: actions.UPDATE_ASSET_SETTINGS_FAILURE,
error,
});
export const updateConfiguration = newConfig => (
dispatch,
getState,
{ rest }
) => {
const assetId = getState().asset.id;
dispatch(updateAssetSettingsRequest());
rest(`/assets/${assetId}/settings`, { method: 'PUT', body: newConfig })
.then(() => {
dispatch(notify('success', t('framework.success_update_settings')));
dispatch(updateAssetSettingsSuccess(newConfig));
})
.catch(error => {
console.error(error);
dispatch(updateAssetSettingsFailure(error));
});
};
export const updateOpenStream = closedBody => (
dispatch,
getState,
{ rest }
) => {
const assetId = getState().asset.id;
dispatch(fetchAssetRequest());
rest(`/assets/${assetId}/status`, { method: 'PUT', body: closedBody })
.then(() => {
dispatch(notify('success', t('framework.success_update_settings')));
dispatch(fetchAssetSuccess(closedBody));
})
.catch(error => {
console.error(error);
dispatch(fetchAssetFailure(error));
});
};
const openStream = () => ({ type: actions.OPEN_COMMENTS });
const closeStream = () => ({ type: actions.CLOSE_COMMENTS });
export const updateOpenStatus = status => dispatch => {
if (status === 'open') {
dispatch(openStream());
dispatch(updateOpenStream({ closedAt: null }));
} else {
dispatch(closeStream());
dispatch(updateOpenStream({ closedAt: new Date().getTime() }));
}
};
@@ -1,6 +0,0 @@
import { ADD_EXTERNAL_CONFIG } from '../constants/config';
export const addExternalConfig = config => ({
type: ADD_EXTERNAL_CONFIG,
config,
});
@@ -1,14 +1,10 @@
import * as actions from '../constants/login';
import { checkLogin } from 'coral-framework/actions/auth';
export const showSignInDialog = () => ({
type: actions.SHOW_SIGNIN_DIALOG,
});
export const hideSignInDialog = () => dispatch => {
dispatch(checkLogin());
dispatch({ type: actions.HIDE_SIGNIN_DIALOG });
};
export const hideSignInDialog = () => ({ type: actions.HIDE_SIGNIN_DIALOG });
export const focusSignInDialog = () => ({
type: actions.FOCUS_SIGNIN_DIALOG,
@@ -0,0 +1,3 @@
import * as actions from '../constants/profile';
export const setActiveTab = tab => ({ type: actions.SET_ACTIVE_TAB, tab });
@@ -71,16 +71,19 @@ export const setActiveTab = tab => dispatch => {
dispatch({ type: actions.SET_ACTIVE_TAB, tab });
};
// @Deprecated
export const addCommentBoxTag = tag => ({
type: actions.ADD_COMMENT_BOX_TAG,
tag,
});
// @Deprecated
export const removeCommentBoxTag = idx => ({
type: actions.REMOVE_COMMENT_BOX_TAG,
idx,
});
// @Deprecated
export const clearCommentBoxTags = () => ({
type: actions.CLEAR_COMMENT_BOX_TAGS,
});
@@ -9,16 +9,12 @@ import AutomaticAssetClosure from '../containers/AutomaticAssetClosure';
import ExtendableTabPanel from '../containers/ExtendableTabPanel';
import { Tab, TabPane } from 'coral-ui';
import ProfileContainer from '../tabs/profile/containers/ProfileContainer';
import Profile from '../tabs/profile/containers/Profile';
import Popup from 'coral-framework/components/Popup';
import IfSlotIsNotEmpty from 'coral-framework/components/IfSlotIsNotEmpty';
import cn from 'classnames';
export default class Embed extends React.Component {
changeTab = tab => {
this.props.setActiveTab(tab);
};
getTabs() {
const tabs = [
<Tab
@@ -53,6 +49,7 @@ export default class Embed extends React.Component {
render() {
const {
activeTab,
setActiveTab,
commentId,
root,
root: { asset },
@@ -65,6 +62,8 @@ export default class Embed extends React.Component {
parentUrl,
} = this.props;
const hasHighlightedComment = !!commentId;
const popupUrl = `login?parentUrl=${encodeURIComponent(parentUrl)}`;
const slotPassthrough = { root };
return (
<div
@@ -75,7 +74,7 @@ export default class Embed extends React.Component {
<AutomaticAssetClosure asset={asset} />
<IfSlotIsNotEmpty slot="login">
<Popup
href={`login?parentUrl=${encodeURIComponent(parentUrl)}`}
href={popupUrl}
title="Login"
features="menubar=0,resizable=0,width=500,height=550,top=200,left=500"
open={showSignInDialog}
@@ -86,18 +85,17 @@ export default class Embed extends React.Component {
/>
</IfSlotIsNotEmpty>
<Slot data={data} queryData={{ root }} fill="embed" />
<Slot passthrough={slotPassthrough} fill="embed" />
<ExtendableTabPanel
className="talk-embed-stream-tab-bar"
activeTab={activeTab}
setActiveTab={this.changeTab}
setActiveTab={setActiveTab}
fallbackTab="stream"
tabSlot="embedStreamTabs"
tabSlotPrepend="embedStreamTabsPrepend"
tabPaneSlot="embedStreamTabPanes"
slotProps={{ data }}
queryData={{ root }}
slotPassthrough={slotPassthrough}
tabs={this.getTabs()}
tabPanes={[
<TabPane
@@ -112,7 +110,7 @@ export default class Embed extends React.Component {
tabId="profile"
className="talk-embed-stream-profile-tab-pane"
>
<ProfileContainer />
<Profile />
</TabPane>,
<TabPane
key="config"
@@ -140,9 +138,5 @@ Embed.propTypes = {
commentId: PropTypes.string,
root: PropTypes.object,
activeTab: PropTypes.string,
data: PropTypes.shape({
loading: PropTypes.bool,
error: PropTypes.object,
refetch: PropTypes.func,
}).isRequired,
data: PropTypes.object.isRequired,
};
@@ -1,10 +0,0 @@
export const FETCH_ASSET_REQUEST = 'FETCH_ASSET_REQUEST';
export const FETCH_ASSET_FAILURE = 'FETCH_ASSET_FAILURE';
export const FETCH_ASSET_SUCCESS = 'FETCH_ASSET_SUCCESS';
export const UPDATE_ASSET_SETTINGS_REQUEST = 'UPDATE_ASSET_SETTINGS_REQUEST';
export const UPDATE_ASSET_SETTINGS_SUCCESS = 'UPDATE_ASSET_SETTINGS_SUCCESS';
export const UPDATE_ASSET_SETTINGS_FAILURE = 'UPDATE_ASSET_SETTINGS_FAILURE';
export const OPEN_COMMENTS = 'OPEN_COMMENTS';
export const CLOSE_COMMENTS = 'CLOSE_COMMENTS';
@@ -1 +0,0 @@
export const ADD_EXTERNAL_CONFIG = 'ADD_EXTERNAL_CONFIG';
@@ -0,0 +1,2 @@
const prefix = 'TALK_EMBED_STREAM';
export const SET_ACTIVE_TAB = `${prefix}_SET_ACTIVE_TAB`;
@@ -2,7 +2,6 @@ import React from 'react';
import { compose, gql } from 'react-apollo';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import isEqual from 'lodash/isEqual';
import get from 'lodash/get';
import branch from 'recompose/branch';
import renderComponent from 'recompose/renderComponent';
@@ -14,12 +13,11 @@ import {
hideSignInDialog,
} from '../actions/login';
import { updateStatus } from 'coral-framework/actions/auth';
import { fetchAssetSuccess } from '../actions/asset';
import {
getDefinitionName,
getSlotFragmentSpreads,
} from 'coral-framework/utils';
import { withQuery } from 'coral-framework/hocs';
import { withQuery, withPopupAuthHandler } from 'coral-framework/hocs';
import Embed from '../components/Embed';
import Stream from '../tabs/stream/containers/Stream';
import AutomaticAssetClosure from './AutomaticAssetClosure';
@@ -107,12 +105,6 @@ class EmbedContainer extends React.Component {
this.props.data.refetch();
this.resubscribe(nextProps);
}
const { fetchAssetSuccess } = this.props;
if (!isEqual(nextProps.root.asset, this.props.root.asset)) {
// TODO: remove asset data from redux store.
fetchAssetSuccess(nextProps.root.asset);
}
}
componentDidUpdate(prevProps) {
@@ -298,7 +290,6 @@ EmbedContainer.propTypes = {
activeTab: PropTypes.string,
parentUrl: PropTypes.string,
data: PropTypes.object,
fetchAssetSuccess: PropTypes.func,
showSignInDialog: PropTypes.bool,
signInDialogFocus: PropTypes.bool,
};
@@ -322,7 +313,6 @@ const mapDispatchToProps = dispatch =>
bindActionCreators(
{
setActiveTab,
fetchAssetSuccess,
notify,
focusSignInDialog,
blurSignInDialog,
@@ -333,6 +323,7 @@ const mapDispatchToProps = dispatch =>
);
export default compose(
withPopupAuthHandler,
connect(mapStateToProps, mapDispatchToProps),
branch(props => !props.checkedInitialLogin, renderComponent(Spinner)),
withEmbedQuery
@@ -1,17 +1,12 @@
import React from 'react';
import ExtendableTabPanel from '../components/ExtendableTabPanel';
import { connect } from 'react-redux';
import { TabPane } from 'coral-ui';
import ExtendableTab from '../components/ExtendableTab';
import { getShallowChanges } from 'coral-framework/utils';
import isEqual from 'lodash/isEqual';
import PropTypes from 'prop-types';
import { withSlotElements } from 'coral-framework/hocs';
import { compose } from 'recompose';
class ExtendableTabPanelContainer extends React.Component {
static contextTypes = {
plugins: PropTypes.object,
};
componentDidMount() {
this.handleFallback();
}
@@ -20,24 +15,6 @@ class ExtendableTabPanelContainer extends React.Component {
this.handleFallback(next);
}
shouldComponentUpdate(next) {
// Prevent Slot from rerendering when only reduxState has changed and
// it does not result in a change of slot children.
const changes = getShallowChanges(this.props, next);
if (changes.length === 1 && changes[0] === 'reduxState') {
const prevKeys = this.getSlotElements(this.props.tabSlot, this.props).map(
el => el.key
);
const nextKeys = this.getSlotElements(next.tabSlot, next).map(
el => el.key
);
return !isEqual(prevKeys, nextKeys);
}
// Prevent Slot from rerendering when no props has shallowly changed.
return changes.length !== 0;
}
handleFallback(props = this.props) {
if (this.getTabNames(props).indexOf(props.activeTab) === -1) {
props.setActiveTab(props.fallbackTab);
@@ -48,38 +25,23 @@ class ExtendableTabPanelContainer extends React.Component {
return this.getTabElements(props).map(el => el.props.tabId);
}
getSlotElements(slot, props = this.props) {
const { plugins } = this.context;
return plugins.getSlotElements(
slot,
props.reduxState,
props.slotProps,
props.queryData
);
}
getPluginTabElements(props = this.props) {
return this.getSlotTabElements(props.tabSlot);
return props.slotElements[0].map(this.createPluginTabFactory(props));
}
getPluginTabElementsPrepend(props = this.props) {
return this.getSlotTabElements(props.tabSlotPrepend);
return props.slotElements[1].map(this.createPluginTabFactory(props));
}
getSlotTabElements(slot) {
return this.getSlotElements(slot).map(el => {
return (
<ExtendableTab
tabId={el.type.talkPluginName}
key={el.type.talkPluginName}
>
{React.cloneElement(el, {
active: this.props.activeTab === el.type.talkPluginName,
})}
</ExtendableTab>
);
});
}
createPluginTabFactory = (props = this.props) => el => {
return (
<ExtendableTab tabId={el.key} key={el.key}>
{React.cloneElement(el, {
active: props.activeTab === el.key,
})}
</ExtendableTab>
);
};
getTabElements(props = this.props) {
const elements = [...this.getPluginTabElementsPrepend(props)];
@@ -92,14 +54,16 @@ class ExtendableTabPanelContainer extends React.Component {
return elements;
}
createPluginTabPane(el) {
return (
<TabPane tabId={el.key} key={el.key}>
{el}
</TabPane>
);
}
getPluginTabPaneElements(props = this.props) {
return this.getSlotElements(props.tabPaneSlot).map(el => {
return (
<TabPane tabId={el.type.talkPluginName} key={el.type.talkPluginName}>
{el}
</TabPane>
);
});
return props.slotElements[2].map(this.createPluginTabPane);
}
render() {
@@ -132,15 +96,15 @@ ExtendableTabPanelContainer.propTypes = {
tabSlot: PropTypes.string.isRequired,
tabSlotPrepend: PropTypes.string.isRequired,
tabPaneSlot: PropTypes.string.isRequired,
slotProps: PropTypes.object.isRequired,
queryData: PropTypes.object,
slotPassthrough: PropTypes.object,
className: PropTypes.string,
sub: PropTypes.bool,
loading: PropTypes.bool,
};
const mapStateToProps = state => ({
reduxState: state,
});
export default connect(mapStateToProps, null)(ExtendableTabPanelContainer);
export default compose(
withSlotElements({
slot: props => [props.tabSlot, props.tabSlotPrepend, props.tabPaneSlot],
passthroughPropName: 'slotPassthrough',
})
)(ExtendableTabPanelContainer);
+33 -8
View File
@@ -141,7 +141,7 @@ export function findCommentInAsset(asset, callbackOrId) {
callback = node => node.id === callbackOrId;
}
if (asset.comment) {
return findComment([getTopLevelParent(asset.comment)], callback);
return findComment([reverseCommentParentTree(asset.comment)], callback);
}
if (!asset.comments) {
return false;
@@ -187,11 +187,12 @@ export function insertFetchedCommentsIntoEmbedQuery(root, comments, parent_id) {
);
}
/**
* attachCommentToParent recurses through the comment tree starting at `topLevelComment`
* to find the parent of `comment` and attach it to the replies.
*/
export function attachCommentToParent(topLevelComment, comment) {
function attachComment(topLevelComment, comment) {
if (!topLevelComment.replies) {
topLevelComment = update(topLevelComment, {
replies: { $set: { nodes: [] } },
});
}
if (topLevelComment.id === comment.parent.id) {
return update(topLevelComment, {
replies: {
@@ -204,16 +205,40 @@ export function attachCommentToParent(topLevelComment, comment) {
},
});
}
if (!topLevelComment.replies.nodes.length) {
return topLevelComment;
}
return update(topLevelComment, {
replies: {
nodes: {
$apply: nodes =>
nodes.map(node => attachCommentToParent(node, comment)),
$apply: nodes => nodes.map(node => attachComment(node, comment)),
},
},
});
}
/**
* attachCommentToParent recurses through the comment tree starting at `topLevelComment`
* to find the ancestor of `comment` and attach it to the replies.
*/
export function attachCommentToParent(topLevelComment, comment) {
let result = topLevelComment;
if (comment.parent.parent) {
result = attachCommentToParent(result, comment.parent);
}
return attachComment(result, comment);
}
/**
* reverseCommentParentTree reverses a comment parent relationship tree
* like `comment -> parent -> parent` into `parent -> parent -> comment -> replies`.
*/
export function reverseCommentParentTree(comment) {
return comment.parent
? attachCommentToParent(getTopLevelParent(comment), comment)
: comment;
}
/**
* Nest a string in itself repeatly until `level` has been reached.
*
@@ -1,28 +0,0 @@
import * as actions from '../constants/asset';
const initialState = {
closedAt: null,
settings: null,
title: null,
url: null,
features: {},
status: 'open',
moderation: null,
};
export default function asset(state = initialState, action) {
switch (action.type) {
case actions.FETCH_ASSET_SUCCESS:
return {
...state,
...action.asset,
};
case actions.UPDATE_ASSET_SETTINGS_SUCCESS:
return {
...state,
settings: action.settings,
};
default:
return state;
}
}
@@ -1,15 +0,0 @@
import { ADD_EXTERNAL_CONFIG } from '../constants/config';
const initialState = {};
export default function config(state = initialState, action) {
switch (action.type) {
case ADD_EXTERNAL_CONFIG:
return {
...state,
...action.config,
};
default:
return state;
}
}
@@ -8,7 +8,7 @@ const initialState = {
errors: {},
};
export default function config(state = initialState, action) {
export default function configure(state = initialState, action) {
switch (action.type) {
case actions.UPDATE_PENDING: {
let next = state;
@@ -1,13 +1,13 @@
import login from './login';
import asset from './asset';
import embed from './embed';
import configure from './configure';
import stream from './stream';
import profile from './profile';
export default {
login,
asset,
embed,
configure,
stream,
profile,
};
@@ -0,0 +1,19 @@
import * as actions from '../constants/profile';
const initialState = {
activeTab: 'comments',
previousTab: '',
};
export default function stream(state = initialState, action) {
switch (action.type) {
case actions.SET_ACTIVE_TAB:
return {
...state,
activeTab: action.tab,
previousTab: state.activeTab,
};
default:
return state;
}
}
@@ -7,11 +7,7 @@ class Configure extends React.Component {
render() {
return (
<div className="talk-embed-stream-configuration-container">
<Settings
data={this.props.data}
root={this.props.root}
asset={this.props.asset}
/>
<Settings root={this.props.root} asset={this.props.asset} />
<hr />
<AssetStatusInfo asset={this.props.asset} />
</div>
@@ -20,7 +16,6 @@ class Configure extends React.Component {
}
Configure.propTypes = {
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
asset: PropTypes.object.isRequired,
};
@@ -1,38 +1,15 @@
import React from 'react';
import QuestionBox from '../../../components/QuestionBox';
import { Icon, Spinner } from 'coral-ui';
import DefaultQuestionBoxIcon from '../../../components/DefaultQuestionBoxIcon';
import cn from 'classnames';
import styles from './QuestionBoxBuilder.css';
import { Icon } from 'coral-ui';
import MarkdownEditor from 'coral-framework/components/MarkdownEditor';
const DefaultIcon = <DefaultQuestionBoxIcon className={styles.defaultIcon} />;
const icons = [{ default: DefaultIcon }, 'forum', 'build', 'format_quote'];
class QuestionBoxBuilder extends React.Component {
constructor() {
super();
this.state = {
loading: true,
};
}
componentWillMount() {
this.loadEditor();
}
async loadEditor() {
const {
default: MarkdownEditor,
} = await import('coral-framework/components/MarkdownEditor');
return this.setState({
loading: false,
MarkdownEditor,
});
}
render() {
const {
questionBoxIcon,
@@ -40,11 +17,6 @@ class QuestionBoxBuilder extends React.Component {
onContentChange,
onIconChange,
} = this.props;
const { loading, MarkdownEditor } = this.state;
if (loading) {
return <Spinner />;
}
return (
<div className={styles.root}>
@@ -25,9 +25,9 @@ class Settings extends React.Component {
onQuestionBoxContentChange,
canSave,
onApply,
slotProps,
queryData,
slotPassthrough,
} = this.props;
return (
<div className={styles.wrapper}>
<div className={styles.container}>
@@ -77,7 +77,7 @@ class Settings extends React.Component {
</div>
)}
</Configuration>
<Slot fill="streamSettings" queryData={queryData} {...slotProps} />
<Slot fill="streamSettings" passthrough={slotPassthrough} />
</div>
</div>
);
@@ -85,8 +85,7 @@ class Settings extends React.Component {
}
Settings.propTypes = {
queryData: PropTypes.object.isRequired,
slotProps: PropTypes.object.isRequired,
slotPassthrough: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
canSave: PropTypes.bool.isRequired,
onToggleModeration: PropTypes.func.isRequired,
@@ -13,13 +13,7 @@ class ConfigureContainer extends React.Component {
return <div>{this.props.data.error.message}</div>;
}
return (
<Configure
data={this.props.data}
root={this.props.root}
asset={this.props.asset}
/>
);
return <Configure root={this.props.root} asset={this.props.asset} />;
}
}
@@ -57,17 +57,24 @@ class SettingsContainer extends React.Component {
const {
mergedSettings,
canSave,
data,
root,
asset,
errors,
updatePending,
} = this.props;
const slotPassthrough = {
root,
asset,
settings: mergedSettings,
updatePending,
errors,
};
return (
<Settings
settings={mergedSettings}
queryData={{ root, asset, settings: mergedSettings }}
slotProps={{ data, updatePending, errors }}
slotPassthrough={slotPassthrough}
savePending={this.savePending}
onToggleModeration={this.toggleModeration}
onTogglePremodLinks={this.togglePremodLinks}
@@ -82,7 +89,6 @@ class SettingsContainer extends React.Component {
}
SettingsContainer.propTypes = {
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
asset: PropTypes.object.isRequired,
pending: PropTypes.object.isRequired,
@@ -0,0 +1,20 @@
.root {
text-align: center;
padding-top: 24px;
}
.icon {
font-size: 64px;
color: #3a4a52;
}
.title {
font-size: 18px;
margin-bottom: 8px;
}
.info {
margin-top: 0px;
font-size: 14px;
color: #7d8285;
}
@@ -0,0 +1,14 @@
import React from 'react';
import styles from './BlankCommentHistory.css';
import { Icon } from 'coral-ui';
import cn from 'classnames';
import t from 'coral-framework/services/i18n';
export default () => (
<section className={cn(styles.root, 'talk-my-profile-comment-history-blank')}>
<Icon name="chat" className={styles.icon} />
<h1 className={styles.title}>{t('comment_history_blank.title')}</h1>
<p className={styles.info}>{t('comment_history_blank.info')}</p>
</section>
);
@@ -15,6 +15,7 @@
.main {
min-width: 70%;
max-width: 100%;
}
.sidebar {
@@ -11,10 +11,20 @@ import { getTotalReactionsCount } from 'coral-framework/utils';
import t from 'coral-framework/services/i18n';
class Comment extends React.Component {
goToStory = () => {
this.props.navigate(this.props.comment.asset.url);
};
goToConversation = () => {
this.props.navigate(
`${this.props.comment.asset.url}?commentId=${this.props.comment.id}`
);
};
render() {
const { comment, link, data, root } = this.props;
const { comment, root } = this.props;
const reactionCount = getTotalReactionsCount(comment.action_summaries);
const queryData = { root, comment, asset: comment.asset };
const slotPassthrough = { root, comment, asset: comment.asset };
return (
<div className={styles.myComment}>
@@ -23,8 +33,8 @@ class Comment extends React.Component {
fill="commentContent"
defaultComponent={CommentContent}
className={cn(styles.commentBody, 'my-comment-body')}
data={data}
queryData={queryData}
passthrough={slotPassthrough}
size={1}
/>
<div className={cn(styles.commentSummary, 'comment-summary')}>
<span
@@ -67,7 +77,7 @@ class Comment extends React.Component {
<a
className={cn(styles.assetURL, 'my-comment-anchor')}
href="#"
onClick={link(`${comment.asset.url}`)}
onClick={this.goToStory}
>
{t('common.story')}:{' '}
{comment.asset.title ? comment.asset.title : comment.asset.url}
@@ -77,10 +87,7 @@ class Comment extends React.Component {
<div className={styles.sidebar}>
<ul>
<li>
<a
onClick={link(`${comment.asset.url}?commentId=${comment.id}`)}
className={styles.viewLink}
>
<a onClick={this.goToConversation} className={styles.viewLink}>
<Icon name="open_in_new" className={styles.iconView} />
{t('view_conversation')}
</a>
@@ -91,9 +98,10 @@ class Comment extends React.Component {
fill="historyCommentTimestamp"
defaultComponent={CommentTimestamp}
className={'talk-history-comment-published-date'}
created_at={comment.created_at}
data={data}
queryData={queryData}
passthrough={{
created_at: comment.created_at,
...slotPassthrough,
}}
inline
/>
</li>
@@ -105,10 +113,9 @@ class Comment extends React.Component {
}
Comment.propTypes = {
comment: PropTypes.shape({
id: PropTypes.string,
body: PropTypes.string,
}).isRequired,
comment: PropTypes.object.isRequired,
navigate: PropTypes.func.isRequired,
root: PropTypes.object.isRequired,
};
export default Comment;
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Comment from './Comment';
import Comment from '../containers/Comment';
import LoadMore from './LoadMore';
import BlankCommentHistory from './BlankCommentHistory';
class CommentHistory extends React.Component {
state = {
@@ -21,18 +22,20 @@ class CommentHistory extends React.Component {
};
render() {
const { link, comments, data, root } = this.props;
const { navigate, comments, root } = this.props;
if (!comments.nodes.length) {
return <BlankCommentHistory />;
}
return (
<div>
<div className="talk-my-profile-comment-history">
<div className="commentHistory__list">
{comments.nodes.map((comment, i) => {
return (
<Comment
key={i}
data={data}
root={root}
comment={comment}
link={link}
navigate={navigate}
/>
);
})}
@@ -51,8 +54,7 @@ class CommentHistory extends React.Component {
CommentHistory.propTypes = {
comments: PropTypes.object.isRequired,
loadMore: PropTypes.func,
link: PropTypes.func,
data: PropTypes.object,
navigate: PropTypes.func,
root: PropTypes.object,
};
@@ -0,0 +1,11 @@
.userInfo {
margin-bottom: 20px;
}
.email {
margin: 0;
}
.username {
margin-bottom: 4px;
}

Some files were not shown because too many files have changed in this diff Show More