Will mark the comment's metdata as a word list
time out if it happens and also tag them with
suspect or banned word.
Then we show "possible suspect/banned word"
markers on the moderate card so moderators can
manually review them.
CORL-1264
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* Remove vertical padding and line height on badges
Allows them to align with the time and user name
text elements.
* Hide report button text on mobile screens
* Allow read more links to wrap text on mobile
* Wrap comment tags when on mobile screens
* Fix collapse alignment on mobile screens
* Update top bar responsive scaling
* Use MatchMedia inside ReportButton
* Fix justification on comment TopBarRight
This will update the admin and user CSV
downloads to include a "Media" column that
will specify the media type and the URL
for the media content.
CORL-1188
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This allows staff members to comment anything
they want, even if it's on the banned word list.
CORL-1255
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Create preliminary media preferences
Allows user to select whether they want to
automatically show media or not.
CORL-1248
* Fix up the copy around media preferences
CORL-1248
* Rename EmbedPreferences to UserMediaSettings
CORL-1248
* Add error/validation messages to media prefs
CORL-1248
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* fix: fixed types and some unmanaged timeouts
* fix: refetch type
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
If the feature flag READ_MORE_NEW_TAB is
set, then clicking on "Read more of this
conversation" will open a new tab.
CORL-1246
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Disable scrolling on site moderators modal
The site moderator modal already has a scroll bar
inside it and its height is less than 480px. We
don't need a scrollbar on the modal background since
the modal window will always be fully visible on
even the smallest screens.
This eliminates the bug of the modal sliding away
when there are enough sites in the org to cause the
background scroll to be activated.
CORL-1227
* Stop checkboxes from shoving input element down
The checkbox input element that we style away
using ::before css was being shoved down the
dom non-relative to the checkbox root.
Now it's relative to the checkbox root and positioned
accordingly.
CORL-1227
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Create a common date formatter
Updates all uses of Intl.DateTimeFormat(...)
with re-usable date time formatter functions.
The formatter functions have default formatting
options, but these can be overridden.
CORL-794
* Include options in useMemo
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* Make date formatting accept single locale string
Makes formatDate and createDateFormatter accept
string | string[] | undefined for the locales
argument.
CORL-794
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* fix: ensure user editable time use setLongTimeout
* fix: fixed wrong type
* fix: fixed snapshots
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* fix: added a single retry to user create
* feat: added additional error context
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* mobile display fixes
* show button full text at larger breakpoint
* update snaps
* hardcode in media query for reaction buttons
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* correctly attach media to edited comments
* ensure media can be removed in edits
* fix: updates to support repeat post
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* feat: Added Site.topStories edge
* feat: Added User.ongoingDiscussions edge
* connect discussions tab to relay
* style discussions tab
* add message if no ongoing discussions
* style site name in story row
* fix: make line-heights relative
* add custom class hooks
* feat: condition display based on feature flag
* add target attribute to story links
* fix: expose some featureFlags
* fix: fixed sorting
* fix: copy fixes
Co-authored-by: tessalt <tessathornton@gmail.com>
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
* don't save clientMutationId when creating announcement
* move mutationId filtering from resolver to mutation
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* pass custom stream css url through to html
* rename streamcssURL to customCSSURL
* only enable custom css query on stream route
* Update src/core/server/app/router/client.ts
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* simplify template for client html
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Shows "Network error. Please refresh your page
and try again." when the retry middleware times
out from too many attempts on failed/timed out
requests.
CORL-1199
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
When we set up a Slack channel, you can select to have
"All comments" sent to the slack channel. If we do this
we want staff comments to come through as well.
This wasn't happening before because there is a `staffCreated`
flag instead of `created` when a staff member comments.
So we change the trigger return type to an array, and when
a staff comment appears, return `staffCreated` as well as
`created` so the all filter lets it through.
I also changed `getBlocks(...)` to `getContent(...)` as it
now returns a JSON object with both a `blocks` array and a
`text` string field. This fixes the problem where Slack would
notifications would say "this content cannot be displayed".
Now it will say the text provided.
CORL-1172
* fix bug where dashboard would not display data for sites beyond first page of results
* remove unused param
* remove unused file
* undo rename
* rename selectedSite to site
* check that sites.edges.length is greater than 0
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* translate error from iframe embeds
* use transtlate function for iframe error message
* fix import order
* Fix typo in translation key
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Fix edit comment form
* clean up editcomment stack for media attachments
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
The badge icon was removed from material fonts.
There are several icons in this category that are
in flux on material's site. Lets keep a close eye
on this as it could mean other icons stop working
in future as well.
CORL-1184
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Repair theming and CSS variables for the rebrand
This separates the CSS variables into three sections
for admin, stream, as well as a shared set between
them.
This also adds injection of the raw colours from the
design team into post css variables.
Lastly, this re-maps the existing theme variables to
a new consolidated set with fallbacks for compatibility.
Since this is a singular commit from various WIP commits,
I am crediting @cvle as well as myself for this work.
Thank you all who helped make this rebrand with theming
possible!
CORL-1155
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
* Convert old css variables in CallOut
* Rename postive/negative => success/error
CORL-1155
* Change some CSS Variable names
* fix TextField/PasswordField colors
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
* Create Twitter and YouTube embed components
Uses the `/api/oembed` endpoint to proxy the
oembed requests that the embed components drop
into an iframe.
CORL-1012
* Create preliminary embed link parsing/storage
CORL-1012
* Create preliminary embed section on comments
CORL-1012
* Preliminarily add admin embed config options
CORL-1012
* Show a "missing" message when embed is unavailable
CORL-1012
* Simplify naming of embeds in schema
embedLinks -> embed
CORL-1012
* Rename oEmbedHandler to oembedHandler
CORL-1012
* add backend services for giphy
* search gifs on frontend
* display selected gif
* show gif previews
* display giphy attribution and no results text
* save a gif to a comment
* use embeds feature for gif embeds
* clean up gif/video/tweet display
* style and configure post comment form
* preview and confirm twitter and youtube embeds
* moderate embeds on server
* update reply and edit forms
* update snaps
* fix some of the tests
* fix tests and types
* fix tests
* fix types
* show gifs in moderate cards
* correctly attach embeds to comments
* make gif rating configurable
* make gif rating configurable
* configure giphy api key
* refactor comment form
* only allow embeds if settings enabled
* scale youtube
* resize embeds if necessary
* make tweets and videos responsive
* set maxwidth on tweet embeds
* update copy for embed config
* force gif search results to fit container
* prevent double posting of gifs
* undo hiding html if empmty because now it doesn't contain random break tags
* use downsampled preview images
* update fixtures and snapshots
* remove unused css
* add i18n string
* remove console logs
* Fix styles on logged-out comment form
* click to pause gif in moderation
* style youtube and twitter embeds in mod stream"
* use mp4s for stream gifs
* use mp4 for moderation gifs
* clean up commentform
* fix dom tests
* update rte
* import oembed module with correct casing
* bump rte
* add correct return type for setInterval
* add migration for embeds config
* catch errors from gif search
* return early from iframe container size calculation if width and height are set
* remove unused classnames
* make giphy api key protected
* reorganize tenant embed settings schema
* update schema on backend to support single comment embed instead of array
* move findEmbedLinks to common
* wrap error
* return function for linkify instead of ternary
* remove unused url param
* clean up oembed service
* remove conditional in repeat post check
* use joi to validate giphy responses
* fix types for embeds
* fix optimistic responses
* move attachEmbeds function
* update snapshots
* fix: improved repeatPost checking
* force case change on oembed
* force rename file name
* feat: Rename Embed -> Media
* fix: cleanup of service functions
* fix: moved types
* fix: fixed logic bug
* fix: fixed translation
* show embeds on history comments
* fix: fixed iframe csp and query param bug
* correct validation for twitter oembed
* feat: save youtube still
* fix: typeerror
* fix: fixed errors related to final form
* fix: fixed issue with types
* fix: added docs to the schema
* fix: linting + tests
Co-authored-by: nick-funk <nick.funk@outlook.com>
Co-authored-by: Wyatt Johnson <me@wyattjoh.ca>
* feat: added server support for site moderators
* feat: added unscoped property to @auth directive
* feat: added frontend support for site moderator feature
* feat: added site moderator support to stream
* fix: linting
* fix: updated snapshots
* Run regex in a sandbox so it can time out
If it times out, we flag it and system withhold
it for future analysis.
CORL-1126
* Pass regex and test string into wordList sandbox
Allows us to use the pre-cached regex instead of
regenerating it via an in-line script copy.
CORL-1126
* feat: improve script reuse
* fix: renamed some functions
* fix: improve script performance
* feat: added testString to log output if it times out
* fix: fixed issue with form alert not showing
* fix: use a timeout from config
Co-authored-by: Wyatt Johnson <me@wyattjoh.ca>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* [CORL-901] Rebrand comment actions and body (#2889)
* [ADR] Use Relay over Apollo (#2881)
* chore: ADR on Relay and Apollo
* chore: typo
* chore: add neg cons
* chore: add another pos
* chore: remove neg, because apollo needed an introspection query as a build step too..
* chore: fix number
* chore: deco
* chore: typo
* chore: clarification
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* chore: bump 6.0.0 (#2891)
* fix: added more checks to migration (#2894)
* Update stream username to new branding variables
CORL-901
* Update badges/tags to use new v2 controls
CORL-901
* Update timestamps to use new branding stream side
CORL-901
* Update stream edit action to new branding
CORL-901
* Update comment html body to new branding
CORL-901
* Update comment action buttons to new branding
CORL-901
* Update responsive styles for action buttons
CORL-901
* Set comment link colors to new branding blue
CORL-901
* Add children prop on ButtonsBar to align with tests
CORL-901
* Make Reported button text bolded and vivid red
CORL-901
* Make reaction buttons stream blue when reacted
CORL-901
* Make user badges bold text
CORL-901
* Set margins on comment action buttons
CORL-901
* Set aria-labels on reaction buttons
Ensures that we always have a usable aria
even when the reaction button is just an icon.
CORL-901
* Set aria-label's on Reply and Share button's
CORL-901
* Update tests to match stream branding changes
CORL-901
* Update color of "Read More of this conversation"
CORL-901
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* [CORL-942] In-Stream Mod rebranding (#2902)
* [ADR] Use Relay over Apollo (#2881)
* chore: ADR on Relay and Apollo
* chore: typo
* chore: add neg cons
* chore: add another pos
* chore: remove neg, because apollo needed an introspection query as a build step too..
* chore: fix number
* chore: deco
* chore: typo
* chore: clarification
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* chore: bump 6.0.0 (#2891)
* fix: added more checks to migration (#2894)
* Update stream username to new branding variables
CORL-901
* Update badges/tags to use new v2 controls
CORL-901
* Update timestamps to use new branding stream side
CORL-901
* Update stream edit action to new branding
CORL-901
* Update comment html body to new branding
CORL-901
* Update comment action buttons to new branding
CORL-901
* Update responsive styles for action buttons
CORL-901
* Set comment link colors to new branding blue
CORL-901
* Add children prop on ButtonsBar to align with tests
CORL-901
* Make Reported button text bolded and vivid red
CORL-901
* Make reaction buttons stream blue when reacted
CORL-901
* Make user badges bold text
CORL-901
* Set margins on comment action buttons
CORL-901
* Set aria-labels on reaction buttons
Ensures that we always have a usable aria
even when the reaction button is just an icon.
CORL-901
* Set aria-label's on Reply and Share button's
CORL-901
* Update tests to match stream branding changes
CORL-901
* Update color of "Read More of this conversation"
CORL-901
* Update caret container to new branding
CORL-942
* Update moderation menu buttons to new branding
CORL-942
* Update in-stream ban popover to new branding
CORL-942
* Update reject tombstone to new branding
CORL-942
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* [CORL-939] Rebrand RTE and reply (#2904)
* [ADR] Use Relay over Apollo (#2881)
* chore: ADR on Relay and Apollo
* chore: typo
* chore: add neg cons
* chore: add another pos
* chore: remove neg, because apollo needed an introspection query as a build step too..
* chore: fix number
* chore: deco
* chore: typo
* chore: clarification
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* chore: bump 6.0.0 (#2891)
* fix: added more checks to migration (#2894)
* Update stream username to new branding variables
CORL-901
* Update badges/tags to use new v2 controls
CORL-901
* Update timestamps to use new branding stream side
CORL-901
* Update stream edit action to new branding
CORL-901
* Update comment html body to new branding
CORL-901
* Update comment action buttons to new branding
CORL-901
* Update responsive styles for action buttons
CORL-901
* Set comment link colors to new branding blue
CORL-901
* Add children prop on ButtonsBar to align with tests
CORL-901
* Make Reported button text bolded and vivid red
CORL-901
* Make reaction buttons stream blue when reacted
CORL-901
* Make user badges bold text
CORL-901
* Set margins on comment action buttons
CORL-901
* Set aria-labels on reaction buttons
Ensures that we always have a usable aria
even when the reaction button is just an icon.
CORL-901
* Set aria-label's on Reply and Share button's
CORL-901
* Update tests to match stream branding changes
CORL-901
* Update color of "Read More of this conversation"
CORL-901
* Update caret container to new branding
CORL-942
* Update moderation menu buttons to new branding
CORL-942
* Update in-stream ban popover to new branding
CORL-942
* Update reject tombstone to new branding
CORL-942
* Update replyTo and rte to new branding
CORL-939
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* Update message box to new branding
CORL-981
* Update user profile comment history to new branding
CORL-983
* Update stream tabs to new branding
CORL-982
* Update my profile tab bar to new branding
CORL-902
* Update download comments to new branding
CORL-902
* The Lord of the Buttons: Return of the Buttons
* Update the notification settings area to new branding
CORL-984
* Update the ignored users area to new branding
CORL-984
* Update change username to new branding
CORL-984
* Fixing snaps after rebase
* Use label instead of div for InputLabel's
Root element is now a label so that axe
will stop complaining that it can't find
the 'for' id on the label elements.
CORL-984
* More spacing tweaks for change username
CORL-903
* Update change email address to new branding
CORL-984
* Update change password to new branding
CORL-984
* Flesh out colour styles for v3 buttons
CORL-984
* Preliminarily update delete account to new branding
CORL-984
* Ensure client CSS style compatibility
CORL-984
* Update delete flow to new branding
CORL-984
* Add client classes to the delete account modal
CORL-984
* Further tweaks to the delete account modal
Modal callouts updated to new branding.
Deletion request callout updated to new
branding.
Fixing up tests that somehow were passing
before?
Fixing some margins and spacing around
deletion section.
* Move the account deletion callout to top
Puts it at the top of the my profile tab
so that it's clearly visible you are
deleting your account.
CORL-998
* Add first-class icon and title support to callouts
CORL-969
* Bold checkbox text when checked
CORL-984
* Finalize v3 buttons to match spec
This should be the last major change to
v3 buttons as the spec seems to have
solidified.
CORL-969
* Add in new stream red to colours
Use it for the negative v3 callouts
CORL-969
* Touch up some spacing on delete account
CORL-984
* Create tombstone component
Use it for ignored and deleted account
tombstones instead of the old callout.
CORL-969
* Use new tombstones in comment stream
CORL-969
* Update banned callout to new branding
CORL-969
* Set callout body text to regular font weight
CORL-969
* Update suspended callout to new branding
CORL-969
* Update closed stream callouts to new branding
CORL-969
* Update in-moderation callouts to new branding
CORL-969
* Update stream validation message to v3
CORL-969
* Improve ignored commenter management
Show "you are no longer ignoring" a
commenter when you choose to no longer
ignore them.
CORL-457
* Prettier cleanup after rebase off master
Somehow this was missed, probably needed to
kill and reload VSCode before I committed the
rebase.
* Switch previous callouts to use icon and title
CORL-969
* Update configure checkboxes to new branding
CORL-903
* Update Config > Q&A to new branding
CORL-903
* Update Config > Open/Close Stream to new branding
CORL-903
* Add validation message to config stream checkboxes
CORL-903
* Remove double list handling for Pref>Ignored
CORL-969
* Show experimental tag beside Q&A config
CORL-1051
* Move live update setting to its own section
CORL-903
* Remove moderation link from config area
CORL-903
* De-capitalize all the labels in configure
CORL-903
* Update message box config to new branding
Also moves it to new location in config.
CORL-903
* Re-brand the sign in/out field on the stream
CORL-1042
* Update tests for add message flow
CORl-903
* Rebrand Sign In/Up modals
CORL-999
* Re-brand SSO sign in/up modals
CORL-999
* Re-brand stream sorting controls
CORL-1043
* Create new stream focused colorFromMeta variant
* Rebrand go to moderation buttons
CORL-799
* Rebrand stream moderation drop-down
CORL-799
* Rebrand the report comment flow
Expands the report comment dialogs under
the comment instead of as a popover.
Also adds in the new branding styles.
CORL-941
* Rebrand the main stream tab bar
CORL-799
* Add new abusive reporting options
CORL-1009
* Rebrand featured comments
CORL-968
* Rebrand the community guidelines
CORL-1041
* Rebrand the share button
CORL-940
* Update style names on buttons
marginSize -> paddingSize
textSize -> fontSize
* Rebrand single conversation view
CORL-904
* Make indented comments grey coloured
CORL-904
* Make indented comment borders thinner
CORL-904
* Tweak colours/margins on single conversation view
CORL-904
* Add show comment on single conversation tombstones
CORL-412
* Rebrand single conversation view title
CORL-904
* Add clean target to package.json
Allows us to direct call gulp clean easily.
* Rebrand client side not found page
CORL-1025
* Rebrand password reset flow
CORL-1025
* Rebrand unsubscribe from notifications flow
CORL-1025
* Rebrand email confirmation flow
CORL-1025
* Rebrand download comments flow
CORL-1025
* Fix up account tests after rebrand
CORL-1025
* Add COMMENT_REPORTED_ABUSIVE to moderate card fragment
* Rebrand user ignore flow
Somehow this slipped through the cracks, fixed
it up now
* [CORL 1010] Collapse comment threads (#2976)
* toggle open and closed comment + replies
* show username and date for collapsed comment
* toggle comments and replies open and closed
* keep collapsed state of comments in reply list
* style collapsed comment toggle
* add css class overrides
* style answered comments when collapsed
* adjust spacing on collapse button:
* add hover styles
* add aria labels and update snapshots
* Fix tests and snaps after rebase
* Make main stream tabs visible on mobile (iPhone 5)
* Remove double horizontal rule under My Comments
Horizontal rule wasn't conditionally showing
when we toggled ability to let users download
comments on and off.
* Add aria labelling to main stream tabs
Can now pass in a localization id to assign
aria-label/title to the tab.
* Add localization to account not found
* Update snapshots
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: Tessa Thornton <tessathornton@gmail.com>
* count things in redis
* add rest routes for daily comment totals
* add route for new commenters
* retrieve hourly totals for new commenters and comments
* add rate limiting
* add routes and components for dashboard
* add top stories component
* add activity charts
* clean up rest responses
* style dashboard components
* make dashboard site-aware
* change new commenters to new signups
* generate new signups by day chart
* update status pie chart
* update status pie chart
* allow site selection in dashboard
* cache daily signups
* count user bans in redis
* clean up route and method names
* clean up comment statuses chart and change from pie to bar
* fix package lock
* make daily counts time zone aware
* count rejected comments
* clean up today counts
* count comments from site
* store hourly keys in utc
* show daily user signups
* move siteID from params to query params
* add average line for daily comments chart
* make average comments count hourly
* show percent values for rejected comments
* style dashboard
* simplify dashboard rest routes
* style today totals and top stories
* style signup and comment activity chart
* add site selector to nav
* feat: redis/mongo refactor
* fix: some small tweaks
- Added comments to magic numbers
- Added errors for missing input
- Consolidated promise resolutions
* Revert "add site selector to nav"
This reverts commit 1c2b1dee34fb2742b04932079fd45f7f3de98418.
* show first site dashboard by default
* style dashboard site switcher
* updte snapshot
* add dashboard 118n keys
* udpate comment activiyt chart with legend and tooltip
* implement refresh button and loading states
* change colours of charts for today
* adjust today values spacing
* remove unused package
* don't pass redis into oauth strat
* remove unused package
* Revert "remove unused package"
This reverts commit 5b7c83a072604810ce7097865655e9ef8114d9e0.
* fix merge conflicts
* Fix icons bug on smaller screens
* resolve merge conflict
Co-authored-by: Wyatt Johnson <me@wyattjoh.ca>
* feat: added rudderstack support with events
- Added events for
- Comment Moderated
- Comment Created
- Story Created
- Comment Reaction Created
- User Flagged Comment
* fix: added logging to event tracking
* Use SSO validation for updateUserUsername
CORL-1121
* Remove validation on admin-only user rename
We don't need to validate the user-name as
only admin's will be using this mutator. If
they're updating things incorrectly, that's
up to them to manage with this flow.
CORL-1121
* fix: improved count handler for stories not found
* feat: removed performance-now
* feat: cleaned up processors, exposed counts
* feat: increased verb of schd jobs
* fix: removed dead code
* fix: improve wordlist highlighting and perf
* fix: updated tests
* fix: implmeneted new regexp lib/patterns
* fix: improve comment body css
* fix: take into account the tree shaking is disabled
See: https://github.com/webpack/webpack/issues/7094
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* Add tenantID and siteID to StoryCreatedEventPayload
* fix: added tenantID to payload
* Remove tenantID from StoryCreatedCoralEvent
* Add tenantDomain to webhook schema
* fix: small comment fixes
Co-authored-by: Wyatt Johnson <me@wyattjoh.ca>
* add allcomments option to slack config
* create separate class for hadnling slack event publishing
* add strings
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* feat: initial impl
* Create preliminary SSO rotation components
CORL-929
* Create rotateSSOKey mutation
CORL-929
* Fix sorting by date for SSO keys
CORL-929
* Show tool tips beside expiring/expired statuses
CORL-929
* Hook up Deactivate and Delete SSO key mutations
CORL-929
* Tweak expired tooltip on SSO keys
CORL-929
* Replace old SSO key config with key rotation
CORL-929
* Fix copy button for SSO key's secret
CORL-929
* Refactor SSOKeyCard func's into components
All the func's building the sub-components
were prime targets for component's with props.
CORL-929
* Update tests to match SSO Key rotation
CORL-929
* Fix typo in translation id
CORL-929
* Test key rotation
CORL-929
* Plumb disabled through SSO key rotation
CORL-929
* Remove duplicate input/payload pairs from schema
For some reason it perfectly duplicated the
input/payload pairs for SSO key rotation on
rebase.
CORL-929
* Remove debug logging
CORL-929
* Use switch instead of if's to compute SSO date field
CORL-929
* Use switch to compute SSO action button state
CORL-929
* Use switch to compute SSO StatusField state
CORL-929
* Remove 10 second key rotation option
CORL-929
* Use memo in sorting SSO keys
CORL-929
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* chore: ADR on Relay and Apollo
* chore: typo
* chore: add neg cons
* chore: add another pos
* chore: remove neg, because apollo needed an introspection query as a build step too..
* chore: fix number
* chore: deco
* chore: typo
* chore: clarification
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
* Add additional error handling around logQuery
We are seeing that sometimes the context has
an undefined logger. We probably want to catch
this case and ensure we don't fail. If it happens
again, we will catch everything we need to know
and that will help us resolve the issue in the
future.
CORL-933
* Simplify logging objects for efficiency
Some of the objects that we were going to log
are too large to be dumped to the logging context.
Instead, prefer simple boolean evaluation of their
existence.
CORL-933
* Fix various Q&A moderation/tagging issues
- Allow Staff members to have their questions
answered and appropriately tagged
- Properly filter answering for only top level
questions (comments)
- Add documentation around various moderation
phases and comment creation steps
- Remove unnecessary status filter when setting
the status for a comment
* fix: abstracted out perspective configs
* fix: reworked tag injection
* Fix sorting/unused imports
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* [CORL-863] Allow streams to be converted/configured to Q&A (#2809)
* Create preliminary schema changes for Q&A
Adds a mode and expert User onto the StorySettings.
Adds a mode selection drop down on a story's
Configure tab.
CORL-863
* Allow multiple experts, remove form elements from search
Makes the previous expert user on a Q&A story now
an array of users who can be assigned.
Converts the previous form based search that was
pulled from the admin community area into a set
of events built on callbacks.
CORL-863
* Create addExpertToStory mutation
CORL-863
* Create removeExpertFromStory mutation
CORL-863
* Conditionally show the the expert selection options
CORL-863
* Create a dropdown search control for Q&A experts
CORL-863
* Fixing up tests to match new QA stream options
Adds a few localization fixes to make sure tests
pass.
Updates existing snapshots.
CORL-863
* Add load more button to expert search list
CORL-863
* Update experts query to match react upgrades
CORL-863
* Move the Q&A config to its own section under stream config
Create enable and disable Q&A mutations/button toggle.
CORL-863
* Fix alignment and layout of expert list items
CORL-863
* Define translations and update tests
CORL-863
* Use official copy for Q&A config
CORL-863
* [CORL-856] Show expert badge on comments (#2829)
* Create preliminary schema changes for Q&A
Adds a mode and expert User onto the StorySettings.
Adds a mode selection drop down on a story's
Configure tab.
CORL-863
* Allow multiple experts, remove form elements from search
Makes the previous expert user on a Q&A story now
an array of users who can be assigned.
Converts the previous form based search that was
pulled from the admin community area into a set
of events built on callbacks.
CORL-863
* Create addExpertToStory mutation
CORL-863
* Create removeExpertFromStory mutation
CORL-863
* Conditionally show the the expert selection options
CORL-863
* Create a dropdown search control for Q&A experts
CORL-863
* Fixing up tests to match new QA stream options
Adds a few localization fixes to make sure tests
pass.
Updates existing snapshots.
CORL-863
* Add load more button to expert search list
CORL-863
* Update experts query to match react upgrades
CORL-863
* Move the Q&A config to its own section under stream config
Create enable and disable Q&A mutations/button toggle.
CORL-863
* Fix alignment and layout of expert list items
CORL-863
* Define translations and update tests
CORL-863
* Use official copy for Q&A config
CORL-863
* Show expert badges on comments when Q&A is enabled
CORL-856
* Update mutation responses and tests due to added expert fields
CORL-856
* Use EXPERT user tags to denote expert users
Removes the need for viewerIsExpert and
authorIsExpert loader/resolvers on Stories
and Comments respectively.
CORL-856
* [CORL-879] Add an unanswered tab to stream when in Q&A mode (#2838)
* Create preliminary schema changes for Q&A
Adds a mode and expert User onto the StorySettings.
Adds a mode selection drop down on a story's
Configure tab.
CORL-863
* Allow multiple experts, remove form elements from search
Makes the previous expert user on a Q&A story now
an array of users who can be assigned.
Converts the previous form based search that was
pulled from the admin community area into a set
of events built on callbacks.
CORL-863
* Create addExpertToStory mutation
CORL-863
* Create removeExpertFromStory mutation
CORL-863
* Conditionally show the the expert selection options
CORL-863
* Create a dropdown search control for Q&A experts
CORL-863
* Fixing up tests to match new QA stream options
Adds a few localization fixes to make sure tests
pass.
Updates existing snapshots.
CORL-863
* Add load more button to expert search list
CORL-863
* Update experts query to match react upgrades
CORL-863
* Move the Q&A config to its own section under stream config
Create enable and disable Q&A mutations/button toggle.
CORL-863
* Fix alignment and layout of expert list items
CORL-863
* Define translations and update tests
CORL-863
* Use official copy for Q&A config
CORL-863
* Show expert badges on comments when Q&A is enabled
CORL-856
* Update mutation responses and tests due to added expert fields
CORL-856
* Use EXPERT user tags to denote expert users
Removes the need for viewerIsExpert and
authorIsExpert loader/resolvers on Stories
and Comments respectively.
CORL-856
* Show an unanswered comment stream when Q&A is enabled
CORL-879
* Do not visually show the unanswered tag
CORL-879
* [CORL-859] Convert Featured stream into Answered for Q&A (#2842)
* Create preliminary schema changes for Q&A
Adds a mode and expert User onto the StorySettings.
Adds a mode selection drop down on a story's
Configure tab.
CORL-863
* Allow multiple experts, remove form elements from search
Makes the previous expert user on a Q&A story now
an array of users who can be assigned.
Converts the previous form based search that was
pulled from the admin community area into a set
of events built on callbacks.
CORL-863
* Create addExpertToStory mutation
CORL-863
* Create removeExpertFromStory mutation
CORL-863
* Conditionally show the the expert selection options
CORL-863
* Create a dropdown search control for Q&A experts
CORL-863
* Fixing up tests to match new QA stream options
Adds a few localization fixes to make sure tests
pass.
Updates existing snapshots.
CORL-863
* Add load more button to expert search list
CORL-863
* Update experts query to match react upgrades
CORL-863
* Move the Q&A config to its own section under stream config
Create enable and disable Q&A mutations/button toggle.
CORL-863
* Fix alignment and layout of expert list items
CORL-863
* Define translations and update tests
CORL-863
* Use official copy for Q&A config
CORL-863
* Show expert badges on comments when Q&A is enabled
CORL-856
* Update mutation responses and tests due to added expert fields
CORL-856
* Use EXPERT user tags to denote expert users
Removes the need for viewerIsExpert and
authorIsExpert loader/resolvers on Stories
and Comments respectively.
CORL-856
* Show an unanswered comment stream when Q&A is enabled
CORL-879
* Create preliminary schema changes for Q&A
Adds a mode and expert User onto the StorySettings.
Adds a mode selection drop down on a story's
Configure tab.
CORL-863
* Do not visually show the unanswered tag
CORL-879
* Allow multiple experts, remove form elements from search
Makes the previous expert user on a Q&A story now
an array of users who can be assigned.
Converts the previous form based search that was
pulled from the admin community area into a set
of events built on callbacks.
CORL-863
* Create addExpertToStory mutation
CORL-863
* Create removeExpertFromStory mutation
CORL-863
* Create a dropdown search control for Q&A experts
CORL-863
* Fixing up tests to match new QA stream options
Adds a few localization fixes to make sure tests
pass.
Updates existing snapshots.
CORL-863
* Add load more button to expert search list
CORL-863
* Update experts query to match react upgrades
CORL-863
* Move the Q&A config to its own section under stream config
Create enable and disable Q&A mutations/button toggle.
CORL-863
* Fix alignment and layout of expert list items
CORL-863
* Define translations and update tests
CORL-863
* Show expert badges on comments when Q&A is enabled
CORL-856
* Use official copy for Q&A config
CORL-863
* Update mutation responses and tests due to added expert fields
CORL-856
* Use EXPERT user tags to denote expert users
Removes the need for viewerIsExpert and
authorIsExpert loader/resolvers on Stories
and Comments respectively.
CORL-856
* Create the answered stream for Q&A
CORL-859
* Sort the Q&A on Most Voted by default
CORL-859
* Fix type mismatch between post comment form and fragments
CORL-859
* Adding localizations for Q&A tags
* Hide feature flags in Q&A streams
* Allow experts to clear answered questions
Can click a button that shows up in the unanswered
tab under answered questions to refresh the stream,
clearing the answered questions from that tab.
* Show arrow upvote icon when in Q&A mode
Also localized the upvote text so it can
be translated.
* Hide mod/report buttons on answered questions
* Remove unnecessary fragment container
* Remove errant debug console log
* Make story mode required on story settings
* Make remove button outlined, not filled
* Further schema changes around Q&A and experts
Rename add/remove story expert to removeStoryExpert
and addStoryExpert naming.
Replace enableQA and disableQA mutators with single
updateStoryMode mutator.
* Remove story mode from UpdateStorySettings
* Replace inline string val's with enum
* add dependencies to useEffect
* docs cleanup around tags.type index check
* Approve a question when it is answered in Q&A
Approves using the author's id as the moderator
* Add comment around use of TAG on comments edge
* Use tagFilter instead of $elemMatch to filter by tags
* Improve responsive styles for expert list items
* Update copy to "Done" from "Remove answered questions"
* Text styling for no users found text
Styles the expert search list to have proper
text styling when no users are found for the
search keyword.
* Remove duplicate checks around story experts
Not necessary as Mongo does this for us.
* Fix a missed "sort imports" during rebase
* Refactor Q&A moderation phases for clarity
Simplify logic and update comments.
Rename: "answered" -> "tagExpertAnswers"
Rename: "unanswered" -> "tagUnansweredQuestions"
* Remove username & email from add expert mutation
* Format expert list emails with Localized
* Break out no comments logic into fragment
* Remove ref handling from expert search field
Use value assignment on TextField instead.
* Replace Box with Flex and CSS
* Show Q&A tooltip on Answered tab
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* feat: added new linking backend
* feat: added duplicateEmail to hash
* fix: stored the duplicate email on the user
* feat: initial implmentation of account linking in auth
* test: fix unit tests
* fix+test: translations and tests added
* chore+test: rename view to LINK_ACCOUNT + more tests
* feat+test: account linking admin + more tests
* feat: Handle incomplete accounts
* chore: add some comments
* feat: expose duplicateEmail through graphql and impl for stream
* feat: admin to use duplicateEmail from graphql
* fix: no need to validate password for account linking
* fix: dont validate password
* fix: no need to render error message when account was incomplete
* chore: log to console when encountering incomplete account
* chore: adjust comment
* chore: simplify + add comments
* chore: wording
* chore: comments
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* show comment counts for stories in story table
* remove debug code
* add 'approved' moderation queue to moderation tabs
* add site/story specific routes
* Revert "remove debug code"
This reverts commit ed3a44304d225c79336423f34d0bde57a998cd69.
* Revert "show comment counts for stories in story table"
This reverts commit 61eb00c70c873fd2d10f1476601c7a69ae12651d.
* use SHORT_NUMBER fluent function to format comment counts
* fix: short number algo
* chore: remove whitespace
* chore: rename var
Co-authored-by: Vinh <vinh@vinh.tech>
* move download comments to my comments tab
* only show download comments if available
* move ignored users management to same tab as notifications, rename to preferences
* fix query and ts defs
* add url to jwt
* make account tab go to external url if provided
* ensure url is an optional jwt field
* update tabs for stream profile
* update classnames for tabs
* fix tests
* feat: initial webhook impl
* feat: added support for key rotation
* feat: harmonized fetcher
* feat: added expired secrets cleaning
* feat: event system refactor
* feat: added story event
* feat: simplfiied webhook handler
* feat: added ref's to locations where user events can be added
* feat: added UI to support webhooks
* fix: renaming some Webhook -> WebhookEndpoint
* fix: review comments to adjuist flow
* feat: added localizations
* fix: linting, updated snapshots
* fix: adapted for new fluent
* fix: rearranged folders
* fix: linting
* feat: added webhooks documentation
* feat: improved toc generation
* feat: added some tests to webhooks
* fix: chain transition hooks
* feat: added tests around webhook ui
* fix: renamed events
* fix: adjusted circle markdown linting
* fix: adjusted doctoc script call
* review: review fixes
* review: review comments
* review: adjusted signing secret confirmation
* review: adjusted styles to harmonize button usage
* fix: updated snapshots and tests
* review: move form out of webhooks
Moved the form out of the webhooks by relocating the layout used for the
route associated with the configure routes.
* fix: fixed bugs and snapshots with tests
* feat: revised slack message format to use block api
* fix: fixed a small text bug
Co-authored-by: Vinh <vinh@vinh.tech>
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* resovle import error by removing useContext from ui component
* update snaps
* create useUIContext hook
* add site and community models
* create sites and communities on install
* add site name to install wizard
* add site id to stories
* pass site id to stream query in embed
* fix spec
* add sites query
* list sites in organization config
* add route for new sites
* add create site mutation
* view and update sites
* show embed codes for sites
* add site id to comments
* allow filtering moderation queues by site id
* add site selector to queue
* move sites config routes
* Revert "move sites config routes"
This reverts commit 4ed5345d3e1df6263f8390b64214956c43c4d8cd.
* update sites routes
* show site name in moderate card
* remove site selector from queue selector
* style create site form
* edit site form
* clean up ts
* move :storyID paths to /storeis/:storyID
* make queues respect site id
* add site switcher
* styles for site selector
* add global notifications
* style app notifications
* clear notifications after x miliseconds
* use notification component in add site form
* fix types
* make notifications dismissable
* dismiss site created notification
* remove button letter spacing if lowercase
* filter stories by site in search
* add site name to story search results
* add site column to stories table
* filter stories table by site
* make sure notification displays after site creation
* paginate sites table
* paginage site selector
* add paginated site filter to stories table
* fix merge conflicts
* sort by createdAt
* default to 20 sites
* delete comments
* add translation tags
* make site ID not mandatory
* Fix tests and specs
* only include site id in embed code for multisite
* update tenant cache when adding first site
* only show site selector if multiple sites
* use story url instead of site id for story upsert
* update snaps
* make ui conditional on multisite
* update snaps and remove unnecessary site ID
* sloppily calculate counts for filtered queues
* get origins of allowed domains
* add migration
* enable migration
* only show permitted domains if mulltisite is false
* remove site id from embed code
* update snaps
* undo updates to singletonresolver
* remove refernces to communities
* fix mints
* remove community reference
* update copy in installation
* use sites services in installer
* remove unused loader
* correct error text for useNotification
* order sites by name
* make multisite a computed property
* use map/filter instead of for/of for url origins
* add missing/incorrect translations
* remove references to siteID
* remove references to tenant isURLpermitted
* add comments to schema updates
* simplify filtering stories by site
* remove domains config from advanced
* fix: adjusted CSP header generation
* add migration to create indexes on site
* clear notifications on navigate
* remove count for filtering by site
* throw duplicate error for allowed domains
* handle errors for create/update sites
* remove contacturl and contactemail from sites
* fix types for counts
* sort imports
* ensure props get passed down to link version of button component
* add url and email fields back into organization config
* sort imports
* fix moderation queues resolver types
* fix appearance of sites dropdown
* add status role to notificaiton
* remove duplicate layout file
* fix: rename allowedDomains -> allowdOrigins
* move Link conditional from button to basebutton component
* fix merge conflict
* fix mutation optimistic response
* make sure to prop gets passed to link
* change labels on install steps
* show story's site in site selector when moderating by story
* feat: support site counting
* update snap
* remove multisite from settings
* move paginated select to admin/components
* fix circular import errors
* remove uicontext component from v2 timestamp
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* [Fix] Use .match instead of .test to avoid false positives when matching regex returned groups
* Add test to assure memoized regexp for banned words will match properly
* fix: fixes bug with wordlist matching
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* CRUD announcements
* only show announcement if not disabled
* make announcements dismissable
* add announcement mutations
* update announcement form logic
* style announcements on stream
* update snap
* localize strings
* close form if announcement is removed
* move announcement config below sitewide commenting config
* move date calculation inside useMemo
* move announcementconfig code to announcementconfigcontainer
* use coralContext for localStorage
* fix type of announcement createdAt
* move announcement form to modal
* remove payload pruning from configure route
* simplify announcement display logic
* make validation message full width
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
When a user did not have any comments when the migration 1575649180000
hits, they are not migrated to get a `commentCounts` property. This
migration finds those users without `commentCounts` and sets them to the
empty comment counts.
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* Adding Swedish translation
* updated snap file for Swedish translation
* Translated sv/auth.ftl and partially translated install.ftl and errors.ftl to swedish
* Translated server/error completly and removed the swedish translation file install
* Fixed merge conflict with Finnish language that was added before this PR was completed
* Fixed wrong semi colon and white space
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
We don't want to clog up the variables list with every
design token from AirTable. Instead, more efficient to
use Post CSS var's that compile down into the CSS bundle
more efficiently.
CORL-748
* Semi-bold selected text on radio buttons
Makes it very obvious which item is selected.
CORL-875
* fix: updated snapshots
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* Align the sidebar and config content in Admin>Configure
CORL-874
* fix: updated snapshots
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* fix: addresses CORL-848
Fixed copy for new commenters feature.
* fix: address CORL-847
Revert the line hight changes on select fields for now.
* fix: addressed CORL-851
Changed copy on CSS field.
* fix: addressed CORL-840
Changed deletion window to 24 hours.
Refactored durations to use TIME enum.
* Create activeStories GraphQL query endpoint
Set lastCommentedAt on stories when they are
commented upon.
Use lastCommentedAt to retrieve the activeStories.
Create a migration to partial index
lastCommentedAt on stories to make retrieval fast.
CORL-836
* fix: adjusted query to use index, more @auth directives
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* Bump line-height on select to account for hanging font characters
Prevents characters like "g" or "j" being cut off at the
bottom of the select.
CORL-829
* Create new tall line height
Use it for the select boxes to allow for dangling
characters like 'g' and 'j'.
CORL-829
* Allow sending of moderation decisions to Google
If enabled in the config, moderation decisions can
be sent to Google.
Simplify OnOffField test id's
Consolidate guard clauses
Reconstruct tenant url's when sending perspective feedback
Use the comment revision id when sending perspective feedback
Use retrieveStory instead of findStory
Clarify logging warning levels on perspective feedback
Clean html tags from sent comment body
Fix include to match new graph context refactors
CORL-825
* Handle asynchronous perspective operation more cleanly
CORL-825
* feat: initial impl
* Create preliminary comment moderation slices
CORL-688
* Move slices logic into stacks
CORL-688
* Create user comment counts
CORL-688
* Create naive mutation that initializes user comment counts
CORL-688
* Use bulk updates in user counts migration
CORL-688
* fix: review
* fix: fixed issue with aggregation
* Migrate creating comment into stacks
CORL-688
* Migrate editing a comment to the stacks
CORL-688
* Break publishing comment status out of updateAllCounts
CORL-688
* review: removed variable scoping in favor of export
* revert: feb8e8196cd448f5cd24f1ca2eb0b91fe9bd43c7
* review: simplification of stacks implementation
This simplifies the stacks implementation to better reuse code related
to count management and event publishing. This can be used to great
effect with the upcomming events PR #2738.
* Consolidate the tenant and common context together
CORL-688
* review: removed variable scoping in favor of export
* revert: feb8e8196cd448f5cd24f1ca2eb0b91fe9bd43c7
* review: simplification of stacks implementation
This simplifies the stacks implementation to better reuse code related
to count management and event publishing. This can be used to great
effect with the upcomming events PR #2738.
* fix: check if authorID is null before update user counts
CORL-688
* Consolidate common/tenant context supporting files
CORL-688
* feat: renamed TenantContext -> GraphContext
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* add new commenters config
* fix specs and fixtures, add translation strings
* save whether a commenter is new
* fix specs and snaps
* add admin role to new config options
* Update copy
* remvoe unused ref
* feat: initial impl
* Create preliminary comment moderation slices
CORL-688
* Move slices logic into stacks
CORL-688
* Create user comment counts
CORL-688
* Create naive mutation that initializes user comment counts
CORL-688
* Use bulk updates in user counts migration
CORL-688
* fix: review
* fix: fixed issue with aggregation
* Migrate creating comment into stacks
CORL-688
* Migrate editing a comment to the stacks
CORL-688
* Break publishing comment status out of updateAllCounts
CORL-688
* review: removed variable scoping in favor of export
* revert: feb8e8196cd448f5cd24f1ca2eb0b91fe9bd43c7
* review: simplification of stacks implementation
This simplifies the stacks implementation to better reuse code related
to count management and event publishing. This can be used to great
effect with the upcomming events PR #2738.
* Remove un-necessary isNew flags on users
CORL-664
* review: removed variable scoping in favor of export
* revert: feb8e8196cd448f5cd24f1ca2eb0b91fe9bd43c7
* review: simplification of stacks implementation
This simplifies the stacks implementation to better reuse code related
to count management and event publishing. This can be used to great
effect with the upcomming events PR #2738.
* fix: check if authorID is null before update user counts
CORL-688
* fix: addressed bug in shared count retrival
Co-authored-by: Tessa Thornton <tessathornton@gmail.com>
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* feat: initial impl
* Create preliminary comment moderation slices
CORL-688
* Move slices logic into stacks
CORL-688
* Create user comment counts
CORL-688
* Create naive mutation that initializes user comment counts
CORL-688
* Use bulk updates in user counts migration
CORL-688
* fix: review
* fix: fixed issue with aggregation
* Migrate creating comment into stacks
CORL-688
* Migrate editing a comment to the stacks
CORL-688
* Break publishing comment status out of updateAllCounts
CORL-688
* review: removed variable scoping in favor of export
* revert: feb8e8196cd448f5cd24f1ca2eb0b91fe9bd43c7
* review: simplification of stacks implementation
This simplifies the stacks implementation to better reuse code related
to count management and event publishing. This can be used to great
effect with the upcomming events PR #2738.
* fix: check if authorID is null before update user counts
CORL-688
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
* Prefix comment download filename with "coral"
CORL-827
* Scrub html tags from downloaded comment data
CORL-828
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
Count management has been adjusted to instead preserve the zero values
of the counts. Old count maintainence functions were also removed
because they were untested and not used.
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
Need to set the message content width so that
the text knows how to wrap. Also accounts for
when the icon is present to set width to the
correct value so it doesn't shift past the edge
of the message box container.
CORL-802
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
* Create preliminary schema for setting Slack channels
CORL-645
* Implement preliminary slack notification using tenant slack channels
CORL-645
* Very preliminarily get data loading with FieldArray's for slack channels
CORL-645
* Update settings input on schema to allow saving Slack settings to tenant
CORL-645
* Filter off UNMODERATED queue events from slack channels
We don't send these to slack through our filters, we only care
about pending, reported, and featured
CORL-645
* Include a moderation link in comments pushed to Slack
CORL-645
* Hook up proper callback functions for adding/removing slack channels
CORL-645
* Add missing translation for Slack navigation item
CORL-645
* Update snapshots for preliminary Slack configuration changes
CORL-645
* Add some FormField wrappers around slack config elements
Makes the UI appear a little nicer
CORL-645
* Set up slack config to only provide one slack channel
We need to do this until we can get ArrayField's working
in final-form.
CORL-645
* Disable the other trigger checkboxes when "All Comments" is checked
CORL-645
* Clean up the formatting of Slack messages
CORL-645
* Add error handling around sending comments to Slack
CORL-645
* Add links to external Slack setup documentation
CORL-645
* Replace form state with wrapped field element
CORL-645
* Clean up fetch request sending Slack notifications
CORL-645
* Prefer global string replacement over RegEx
CORL-645
* Use URL class to construct comment URL's
CORL-645
* Require slack configuration in schema
CORL-645
* Initialize Slack in fixtures
Also fix up a flaky test that wasn't waiting
on form submission and on-change events.
CORL-645
* Preliminarily fix up styles to match other config pages
CORL-645
* Create placeholder add/remove buttons
* Convert SlackConfigContainer to FunctionalComponent
CORL-645
* Add name field to slack channels
CORL-645
* Disable inner fields on Slack channel when not enabled
CORL-645
* Improve the delete channel button
CORL-645
* Use pureMerge to extract slack channel settings
CORL-645
* Do a bit of cleanup on the add channel button
CORL-645
* Update the styling of the Slack config
- Use sub header for channel headings
- Update add channel button text
- Move the remove channel button down
- Other minor spacing tweaks
CORL-645
* Handle comment insertion in stream when sort by oldest
Push the comment to the end of current cursored
comment stream so it shows up.
CORL-758
* Make commenstOrderBy a client only mutation parameter
CORL-758
* fix: addressed linting issue
* Create preliminary schema for setting Slack channels
CORL-645
* Implement preliminary slack notification using tenant slack channels
CORL-645
* Very preliminarily get data loading with FieldArray's for slack channels
CORL-645
* Update settings input on schema to allow saving Slack settings to tenant
CORL-645
* Filter off UNMODERATED queue events from slack channels
We don't send these to slack through our filters, we only care
about pending, reported, and featured
CORL-645
* Include a moderation link in comments pushed to Slack
CORL-645
* Hook up proper callback functions for adding/removing slack channels
CORL-645
* Add missing translation for Slack navigation item
CORL-645
* Update snapshots for preliminary Slack configuration changes
CORL-645
* Add some FormField wrappers around slack config elements
Makes the UI appear a little nicer
CORL-645
* Set up slack config to only provide one slack channel
We need to do this until we can get ArrayField's working
in final-form.
CORL-645
* Disable the other trigger checkboxes when "All Comments" is checked
CORL-645
* Clean up the formatting of Slack messages
CORL-645
* Add error handling around sending comments to Slack
CORL-645
* Add links to external Slack setup documentation
CORL-645
* Replace form state with wrapped field element
CORL-645
* Clean up fetch request sending Slack notifications
CORL-645
* Prefer global string replacement over RegEx
CORL-645
* Use URL class to construct comment URL's
CORL-645
* Require slack configuration in schema
CORL-645
* Initialize Slack in fixtures
Also fix up a flaky test that wasn't waiting
on form submission and on-change events.
CORL-645
* Preliminarily fix up styles to match other config pages
CORL-645
* Create placeholder add/remove buttons
* Convert SlackConfigContainer to FunctionalComponent
CORL-645
* Add name field to slack channels
CORL-645
* Disable inner fields on Slack channel when not enabled
CORL-645
* Improve the delete channel button
CORL-645
* Use pureMerge to extract slack channel settings
CORL-645
* Do a bit of cleanup on the add channel button
CORL-645
* CORL-729 Upgrade final form, fix and improve tests
This is a squashed rebase from these commits:
a300b31c23ab11e5e6f0668bc03ece7697360aaa feat: error on optimisic response warnings during test
dd8a9776865ec41d346e23ae0743d0d4fb0caa21 fix: turn off @typescript-eslint/prefer-regexp-exec rule
b995daacf1722cace60d755e672cb6a3a20d6bc2 feat: mute false warnings in test
e44f9e28307cd63a82c1fb7ac013667dd7b7bc46 fix: wrap remaining tests with act
afbd4329b97f3dbc9f873ea4ff234d98bb651ccf feat: fail when act(async () => ...) without await warnings
51dfb60b7d75411ba2e1a28db33f4aba5cf84de1 feat: fail tests with act warnings
97f93546ed8113e207882411eb4cdb7675b0796c fix: mock window.resizeTo globally in tests
850958b8c4d2fc0aca67ae580296433af223f8ab fix: more tests with act
24c05ab88e9a416e4962acc3f20f2c764ba07657 fix: wrap charCountEditComment test in acts
ed590b82d147470bba74055dc682e6b70d2e76fb fix signInWithEmail
4a2b9402cb6ce9565d99ae1a950eaa422ff603c3 fix: PostCommentFormContainer
815ebe6ef364d954d4bd0a35495934c9d014170b fix: use final form initialize instead of reset and remove obsolete
d3101f2112ed3ffe8d06609620e31e6655d2cf6d Merge branch 'feature/CORL-729-final-form' of https://github.com/coralproject/talk into feature/CORL-729-final-form
a0658da610a5f39b6fae78ffb8dd291b22d54e50 fix: addEmailAddress
60f7fc99a44dfa49dfd401a0ef49c60973b3e8e3 fix: use proper act pattern in renderConfigure.spec.tsx
d66bdfc2245c2b1ee03a1b3a3a56f1d5ba14ddc4 Stop propagation of Modal content click events (#2706)
ec6689594136e22a5b9f05ea284162702dc4955d fix: use proper act pattern in createUsername.spec.tsx
ef239496964a5f9a91ee1c4424ad81537c4f47fe fix: stream configuration
c7e06a0c6aef6b299c41392af81f8a20855028bf fix: user proper act pattern in streamConfiguration
9712e659e394a898500ed649464ff14d4870e589 Merge branch 'feature/CORL-729-final-form' of https://github.com/coralproject/talk into feature/CORL-729-final-form
9e5cfbaf3593615b457055de23f187fa07edd4c4 fix: signIn test
99b44a4a1bbb7ff2cd44c6821ad33b80f90c4a99 fix: user proper act pattern in stories.spec.tsx
ed7c1a92f93ab9aaa85ff92837b0ed21560cb358 fix: user proper act pattern in addEmailAddress
a04b392cb2148b9a24791b062027796c409d053e fix: remove obsolete snapshots
59df67c0f9b9d26c74e2cca7d333f5868b0b202d fix: signUp test
7656f179df95b4cd96b37afbc88a1c3a2944fdf4 fix: use proper act pattern on createPassword
85246fbf1f9ab49ad3a09c11ab79bf537059b548 fix: use correct act() pattern in createUsername.spec.tsx
d5239373a2d1bbed0bfe8c1ca62ef6a70ef5c7d9 fix: the correct way to use act on form submit :-)
d84ecd168354f4acb422a5ddb725fb8faf9c3184 fix: moderation test
d8df62ab1a6486144684ff917c47e6e375ffbe03 fix: reportComment test
2756e3184bb292168e8d34e201f340c3799941e6 fix: auth tests
a28695dbdd313a7bc3dade9ac1f92d6ef0061526 Properly handle final-form actions in tests
2fafc8ea3458c5b15b66f3d65f0947672dd1a516 Update snapshots now that final form isn't overwriting props
1f9bbaec8678a7653124898ba4a2e84ddc1ef243 fix: prevent final form from overwriting field props
f6c66c003d1917db2dcb3f757e8a303266c381fa fix: prevent final form fields overwrite out props
48d1fc7318ee4ba7bf72839127e9a0b1487c1729 chore: rename translation string
728373da5728a4e7c039bd0c3a3cf0037e9f5177 fix: purge relay metadata from request
7cdea925087a6b9b6e318bbb1b31b798be87dc2f fix: radiobuttons
9735bae79222219a81a28d458976a596201b650b chore: revert obsolete checks
0b556e1693584430a5814e81d87b0f233efd1a30 fix: refactor admin configure
b245afc7b196035bcb454e031c966e63c77ce522 fix: implement withForm HOC
5787400051211f5d2e1773d7207f32b66b02a2a1 Update the Configure page form state to properly load form values
8c2af3e22a96a3d2e50e7f06fb45d1fb79cf0c8e Replace form.reset() with setTimeout(form.reset)
27d9c90e3f0166cc2db45db461619be15a3cb950 Update radio buttons and on/off fields to work with final-form updates
b852dd14af85b14ff8e0d2823e1e83bf278b29b9 Replace any on OnSubmit with typed form submission interfaces
f049a70aaf4872825ac3b2aa62dc5cb7f945290a (f) Preliminarily get Coral compiling with latest final-form libraries
* feat: act is now actAndReturn
* fix: print original filename and line number in custom console impl
* feat: trace process warnings
* fix: server warnings about potentially memory leak with too many listeners
* add comment revisions
* add strings
* update fixtures
* fix fixtures
* [CORL-629] Update admin moderation containers to use new branding tokens (#2600)
* Convert the moderation card components to use new styles
CORL-629
* Style the details area in the moderate card using new font and color styles
CORL-629
* Update FlagDetails on Moderate Card to match new branding styles
CORL-629
* Remove typography from ModerateCard Username
CORL-629
* Remove unnecessary new typography tokens created while experimenting
CORL-629
* Update background colors of username buttons on moderate card
CORL-629
* Update approve reject buttons to use new colors
CORL-629
* Fix alignment of username and "Reply to" in InReplyTo component
CORL-629
* Update moderated by on moderate card to match new branding
CORL-629
* Create distinct admin marker and counter components with new branding styles
Update moderate card components to use these distinct newly branded styles.
CORL-629
* Create independent Tabs control with new styling for admin area
Use it on the moderate card details area.
CORL-629
* Remove letter spacing from moderate card styles
CORL-629
* Update "DETAILS" tab on moderate card to be named "INFO"
CORL-629
* Update some missing v2 css variables
CORL-629
* Tweak the spacing of the COMMENT link and title on the moderate card
CORL-629
* Update details font color on moderate card
CORL-629
* Update spacing on newly styled Admin Tab component
CORL-629
* Update spacing of reply to username on the moderate card
CORL-629
* Update moderate card comment text area minimum width and height
CORL-629
* Update vertical divider on moderate card to updated branding
CORL-629
* Introduce new bold open sans font face
Downgrades all existing bold's to semi-bold as they were equivalent before.
CORL-629
* Update moderate card details tabs to use new bold open sans font
CORL-629
* Create an admin specific timestamp control that implements new branding
CORL-629
* Migrate shared moderate card styles into child component files
CORL-629
* [CORL-631] Update admin side main navigation to new branding styles (#2625)
* Convert the moderation card components to use new styles
CORL-629
* Style the details area in the moderate card using new font and color styles
CORL-629
* Update FlagDetails on Moderate Card to match new branding styles
CORL-629
* Remove typography from ModerateCard Username
CORL-629
* Remove unnecessary new typography tokens created while experimenting
CORL-629
* Update background colors of username buttons on moderate card
CORL-629
* Update approve reject buttons to use new colors
CORL-629
* Fix alignment of username and "Reply to" in InReplyTo component
CORL-629
* Update moderated by on moderate card to match new branding
CORL-629
* Create distinct admin marker and counter components with new branding styles
Update moderate card components to use these distinct newly branded styles.
CORL-629
* Create independent Tabs control with new styling for admin area
Use it on the moderate card details area.
CORL-629
* Remove letter spacing from moderate card styles
CORL-629
* Update "DETAILS" tab on moderate card to be named "INFO"
CORL-629
* Update some missing v2 css variables
CORL-629
* Tweak the spacing of the COMMENT link and title on the moderate card
CORL-629
* Update details font color on moderate card
CORL-629
* Update spacing on newly styled Admin Tab component
CORL-629
* Update spacing of reply to username on the moderate card
CORL-629
* Update moderate card comment text area minimum width and height
CORL-629
* Update vertical divider on moderate card to updated branding
CORL-629
* Introduce new bold open sans font face
Downgrades all existing bold's to semi-bold as they were equivalent before.
CORL-629
* Update moderate card details tabs to use new bold open sans font
CORL-629
* Create an admin specific timestamp control that implements new branding
CORL-629
* Migrate shared moderate card styles into child component files
CORL-629
* Update main navigation admin side to use new branding styles
CORL-631
* Bring in some preliminary color and font styles for the search bar
This helps it match navigation, but does not update all the sub-styles of
the search bar's many child components.
CORL-631
* [CORL-694] use new styles for decision history (#2644)
* use new styles for decision history
* remove reference to nonexistent variable
* update snaps
* [CORL 695] admin branding - user menu (#2650)
* update user menu, popover, and dropdown to new design tokens
* fix feature button colours
* use v2 spacing vars
* admin branding: tables (#2651)
* update user menu, popover, and dropdown to new design tokens
* fix feature button colours
* use v2 spacing vars
* style stories and users table
* update snap
* update user status font weight
* remove duplicate declaration
* fix line height references
* update design tokens for text inputs and selects (#2658)
* use box shadow instead of outline for focus states
* Update snapshots to adjust for resolved merge conflicts
* Bring new branding styles to button components (#2667)
* Create preliminary filled and outline buttons that match branding
* Add adornment button variant to newly branded button
* Add the ghost variant to the newly branded button component
* Add underlined variant to the newly branded button component
* Remove external Icon composes property
* Convert camel-case button variables to kebab-case
* [CORL-672] Configuration pages new branding (#2673)
* style config side nav
* general configuration tab branding
* organization tab branding
* moderation configuration branding
* banned/suspect words config branding
* email config branding
* advanced settings branding
* auth config branding
* move helpertext and fieldset components
* add textarea component
* add back gutters on table search
* update snaps
* fix header component to accept labels
* use new spacing form components
* use spacing components for advanced config
* fix tests
* fix line height of radio buttons
* update validation message branding
* update snaps
* fix paths casing
* try lowercase then
* add docs for new form components
* move description component
* update snaps
* move components to /ui/v2
* [CORL-673] Update the moderate area search menu to use new branding styles (#2672)
* Create preliminary filled and outline buttons that match branding
* Add adornment button variant to newly branded button
* Add the ghost variant to the newly branded button component
* Add underlined variant to the newly branded button component
* Remove external Icon composes property
* Convert camel-case button variables to kebab-case
* Preliminarily migrate raw components into v2 to prep for branding updates
CORL-673
* Preliminarily update the search results bar to use new branding tokens
CORL-673
* Update styles to new branding on migrated v2 client-ui components
CORL-673
* Update see all and moderate all search option icons
CORL-673
* style config side nav
* general configuration tab branding
* organization tab branding
* moderation configuration branding
* banned/suspect words config branding
* email config branding
* advanced settings branding
* auth config branding
* move helpertext and fieldset components
* add textarea component
* add back gutters on table search
* update snaps
* fix header component to accept labels
* use new spacing form components
* use spacing components for advanced config
* fix tests
* fix line height of radio buttons
* update validation message branding
* update snaps
* fix paths casing
* try lowercase then
* add docs for new form components
* move description component
* update snaps
* move components to /ui/v2
* Set size="md" on the Icon component and not the Localized component
CORL-673
* tag component
* [CORL-669] user drawer + misc branding (#2686)
* tag component
* top of user drawer branding
* recent history in drawer
* add tooltips component
* use correct spacing prop
* history tabs
* user history and rejected comments
* move callout component'
* moderator notes components
* account history table
* table user row
* swap in tabs components
* remove overflow:hidden on buttons
* update snaps
* replace overflow scroll with auto
* clean up from rebasing vs master
* fix ts
* sort exports
* fix confusing linting errors
* update snaps
* clean up nav bar design
* adjust nav hover colors
* comment content component
* update nav hover styles
* fix search bar border
* clean up moderate card components
* more user drawer cleanup
* user role switcher
* update textfield vars and variants
* update components in community page
* move clickoutside component
* clean up stories table
* moderate route components
* single moderate view
* queue components
* delay component
* relative time component
* decision history components
* user drawer components cleanup
* configure components
* clean up buttons
* update snaps
* add all exports
* [CORL-674] admin branding: modals (#2695)
* update hotkeys modal components
* hotkeys modal
* user status change modals
* user status change modals
* invite users modal
* fix tests
* fix incorrect i18n string
* resolve merge conflicts
* move fonts to devdeps
* Fix username props interface
* fix dom nesting in components
* update formatting in strings
* rewrite delay component as functional component
* remove tslint comments
* change configure header component props
* chore: upgraded node 12, more log lines
- upgraded from 10 LTS to 12 LTS
- added log line with userID to GraphQL
log entry
* fix: adjusted some intl formats
* feature: use react-axe and fix some a11y issues in stream
* fix: adapt snapshots
* chore: fix axe warnings in auth and account bundle
* chore: improve accessibility in install bundle
* chore: add some comments
* feat: improved api for reloading tenants for cli
* fix: cleaned up merge beheviour
* feat: added support for stream/story edge
* feat: support tenant install
* fix: updated snapshot
* fix: fixed tests
* feat: add support for application/json+ld parsing
- upgraded scraper packages to use new jsonld parser
- waiting on https://github.com/microlinkhq/metascraper/pull/225
for merging
- fixes#2670
* chore: metascraper upgrades
* fix: strip tags when comparing for repeat
- share the stripped tag version of the comment
- share the logger to improve pipeline clarity
* fix: renamed variables based on review
* fix: workaround for eslint typescript bug when creating or renaming files.
* fix: downgrade
* fix: do not lint during build
* fix: no need to permanently show eslint status in vscode.
* make comments selectable in queue
* manage focus
* switching focus works
* keyboard navigation sort of works
* scroll into view
* prev, next, approve, reject
* shortcuts for queue switching
* ban modal?
* focus search bar with ctrl f
* keyboards shortcuts modal
* zen mode
* single comment view
* ban users from moderate cards
* clean up ts and lints
* update snaps
* add strings
* update smaps
* remove single comment view shortcut
* add single comment view to moderation queue
* clean up types
* fix deps for useEffect/useCallback hooks
* feat: added toggable help
* remove duplicate text in invite form
* fix: reused message key
- message change consituted a grammar change
that wasn't reflected in other translated languages
* add types for setting user premod
* add types, fields, and mutations for user premod
* enforce premoderation on users marked premod
* add user premod to dropdown
* update specs
* fix tests
* update premod workflow to match v4
* allow user filtering by premod status
* add premod user history to account actions drawer
* update snaps
* fix permissions on new premod fields
* update strings
* fix tests
* clean up formatting and copy
* fix: nullable fixes pre-migration
* fix: fixes user registration endpoints
- fixes#2579
* feat: cleanup from review
- Added seperate create function
- Moved some validation around
* fix: linting
* add live updates for comments moving from premod to approved
* rename disposables
* check if comment is system withheld as well as premod to publish event
Since this is used by Akismet and other spam detection tools, this
wording matches what Wordpress users will expect when seeing comments
detected as spam.
CORL-395
If a mod is looking at a card they themselves moderated, we want their
username to show up under "moderated by". This helps them recognize cards
they themselves moderated.
CORL-615
* Create preliminary endpoint for updating user names via API
CORL-523
* Create preliminary endpoint for updating user emails via API
CORL-523
* Create preliminary endpoint for deleting users via the API
CORL-523
* Hook up the delete, update email, and update user name endpoints
CORL-523
* Update readme to include preliminary GDPR endpoint instructions
CORL-523
* Uncomment limiters on updateEmail endpoint
My mistake leaving these commented while testing, should not have been committed.
CORL-523
* Run DocToc on the README to generate table of contents
CORL-523
* feat: enhanced documentation on account management edges
* fix: prevent double delete of user account
* fix: swapped order of params
* Update README.md
* Update README.md
* fix: remove unknown field title
* fix: remove unknown field title on story
* make session duration configurable by tenant
* fix expiration date calculation
* add form field for session length
* use constant for default session
* update spec
* update fixtures
* add missing translation
* update snap
* fix: use shared variable instead of hardcoded value for tests
* fix: adjusted missing expires in parameter
* Add solid background to Moderate > Config area headers
CORL-560
* Update Config > General section text and font weight
CORL-560
* Update ordering of Config > Moderation page items
CORL-560
* Update text and font weights in Configure > Moderation page
CORL-560
* Update text and font weight on Configure > Organization page
CORL-560
* Update text and font weight on Configure > Banned and Suspect Words page
CORL-560
* Update text and font weight on Configure > Authentication page
CORL-560
* Update text and font weights on Configure > Email page
CORL-560
* Update text and font weights on Configure > Advanced page
CORL-560
* Repair tests around the styling changes made to the moderation config area
CORL-560
* Fix capitalization on the Config > General page
CORL-560
* Make email checkbox light themed so its text shows up on new headers
CORL-560
* Update Header width to account for padding
Prevents it from sticking out over the edge of the page layout
CORL-560
* Align "Sort by" text to the drop down in Admin > Config > General > Reactions
CORL-560
* Update Admin > Config > General snapshot to adjust for vertical aligned text
Vertical flex aligned the "Sort by" text to a combo box in a previous changed
CORL-560
* Rename "Perspective Toxic Comment Filter" header to "Toxic Comment Filter"
CORL-560
* Use overlay scrolling if available to prevent scroll bar width popping
CORL-560
* Remove overflow-y: overlay
CORL-560
* Rename Akismet Spam Detection to Spam Detection
CORL-560
* Make all non-complex text fields full width in Admin > Config
CORL-560
* Remove Authentication Integrations header
Area underneath was empty
CORL-560
* Re-arrange SSO Key Field layout
CORL-560
* Create new typography types for bodyShort and fieldDescription
CORL-560
* Update Admin > Config to use bodyShort, fieldDescription typography
CORL-560
* Add a slight padding on InputLabel
CORL-560
* Add padding on either side of Admin > Config section content
CORL-560
* add settings config for story configuration on advanced panel
* include external link in proxy description
* update copy
* update copy
* fix lints
* update snap
* feat: more stable css classes
* chore: renamee ValidationMessageHelper to FormValidationMessage
* chore: Rename FormValidationMessage to FieldValidationMessage
* feat: more css classes, icons use <i> tag
* feat: stable classnames for gdpr features
* feat: more css stable classnames
* Create preliminary account deletion program flow
Does not validate password as of yet.
Does not submit a mutation to begin deletion scheduling.
CORL-236
* Create preliminary account deletion confirmation form and schema mutation
Hooks up validation and error handling to confirm the user's
password during account deletion.
Scheduling the account deletion is not implemented yet.
CORL-236
* Update requestAccountDeletion to set the user's scheduled deletion date
CORL-236
* Create preliminary cron job for scheduled account deletions
CORL-236
* Show tombstoned comments when the user has deleted their account and comments
CORL-236
* Pull in client locales for date formatting on account deletion steps
CORL-236
* Update more areas due to comment revision being nullable
CORL-236
* Allow users to cancel their account deletion request
CORL-236
* Show account deletion callout at the top of the profile stream tab
CORL-236
* Further comments and edge case handling for deleted comments site wide
CORL-236
* Show account deletion callout in the comments stream tab
CORL-236
* Send out emails during relevant account deletion events
- Confirm deletion requested
- Cancellation of deletion request
- Account deletion completed
CORL-236
* Unset emails when deleting user accounts instead of setting to null
Fixes email index collision error from setting multiple emails to null.
CORL-236
* Show organization email in account deletion steps
CORL-236
* Mark comments as deleted so that we can properly tombstone them in the stream
CORL-236
* Fix improper templating for account deletion completed emails
Sub organization name in where previously we were using the account username.
CORL-236
* Disable user drawer and display deleted flag on users in community
CORL-236
* Check for author before passing inReplyTo in ModerateCardContainer
Sometimes null when user is deleted.
CORL-236
* Tombstone moderate cards when the underlying comment is deleted
CORL-236
* Re-add deleted field to CommentContainer fragment
CORL-236
* Disable commenting or replying when user is scheduled for deletion
CORL-236
* Add snapshot tests around deletion states for comment cards and forms
CORL-236
* Add tests around the account deletion steps
CORL-236
* Set account deletion to run every 30 minutes
CORL-236
* Rename DELETION authorization to PENDING_DELETION
CORL-236
* Change log message for when account deletion tasks finds no more users to delete
CORL-236
* Update snapshots to handle proper deleted flag for scheduled deleting users
CORL-236
* Fix import ordering on various files to match coding standards
CORL-236
* Specify tenantID when querying for user during deletion
CORL-236
* Add back missing clientMutationId on cancelAccountDeletion mutation
CORL-236
* Use $unset to clear the scheduledDeletionDate
CORL-236
* Simplify create of scheduledAccountDeletion CRON function
CORL-236
* Rename and organize scheduledTask creation logic
- Rename startCronJobs to startScheduledTasks
- Return an object of named ScheduledTask items instead of an array of tasks
CORL-236
* Add comment about returning updated user when clearing scheduledDeletionDate
CORL-236
* Remove unnecessary array around tenant.locale in dateTime formatter
CORL-236
* Remove unnecessary non-null enforcement on tenant.id
CORL-236
* Remove string templated React element content
CORL-236
* Move english translated validation error to correct language file
CORL-236
* Simplify rendering of DeletionRequestCallout when deletionDate isn't available
CORL-236
* Use ternary expression instead of multiple {bool && (...)} checks
CORL-236
* Use classes object with line child style to style the step bar
CORL-236
* Update StepBar so that children of Step nodes can be undefined
Allows us to not have to insert empty placeholder strings/elements when
we want to have an empty step node.
CORL-236
* Remove use of luxon from account deletion request callouts for now
We need to decide if the extra 15KB from luxon is worth it in our bundles
before making this change.
CORL-236
* Remove unnecessary embed/deleteAccount endpoint
CORL-236
* Move DeleteAccountModal contents into a separate component
Cleans up the state management when user closes the modal and we
need the modal steps to restart.
CORL-236
* Remove localization around delete account button icon
CORL-236
* Use inline `collection(mongo)` in clearing and setting deletion date
CORL-236
* Simplify form state validation on account deletion confirm page
CORL-236
* Add todo to iterate over tenants in account deletion
CORL-236
* Remove punctuation and add context to logger messages during account deletion
CORL-236
* Break out mongo collection initialization into a shared object
Also adds a try catch error handling around the scheduled deletion
operations. Prevents errors from taking the server down.
CORL-236
* Add TODO to extract out a common formatter for date times
CORL-236
* Update translations for account deletion details
CORL-236
* Update translations for account deletion completion page
CORL-236
* During scheduled deletion, when locking deletion date, return modified user
CORL-236
* Remove un-necessary fragment container around deletion steps component
CORL-236
* Move preventSubmit outside of render function on ConfirmPage
CORL-236
* Convert collections into object of Mongo db collection initializers
Allows us to only initialize the collections we need with our
Mongo instance.
CORL-236
* Remove un-necessary lambda wrapping around collections initializer functions
CORL-236
Wyatt and I are not sure why comments are coming back null, but this should
keep the moderation area from blanking out when it errors handling nulled out
comments crashing the queue.
FIXME tag added with Wyatt/Nick as this is only a patching fix and does
not resolve the underlying issue.
* Add a ban user action to the stream moderation drop down
CORL-382
* Show banned stated for user in stream moderation drop down
If the user is actively banned, the ban user option will be
disabled and show a status of "banned".
CORL-382
* Create utility for generating random stories, comments, and users
CORL-382
* Add ban and suspension values to baseUser in fixtures
CORL-382
* Updated banned.spec.tsx to use new test utilities for generating fixture data
CORL-382
* Prevent users from being able to ban themselves in the moderation dropdown
CORL-382
* Kill optimistic response errors for comment mutations
Set the author.status.current to an empty array so it stops
complaining about it being unused.
CORL-382
* Rename util in tests to helpers/fixture.ts
CORL-382
* Remove unused import from CreateCommentReplyMutation.ts
CORL-382
* Put back the optimistic ban responses into comment mutations
The warnings spewing out during tests are false, for further
detail please see: https://github.com/facebook/relay/pull/2760
CORL-382
* Denormalize generated stories and comments
CORL-382
* Clean up import ordering in ModerationActionsContainer.tsx
CORL-382
* Inject appropriate scoped items into callbacks for moderation dropdown
CORL-382
* Set optimistic response author status from known viewer status
CORL-382
* fix: Make in stream banning work
* feat: Send translated email + reject comment + fix tests
* test: add feature test
* feat: add copy mentioning comment rejection
* chore: improve loading state
* chore: add tiny comment
* fix: bug in lookup not checking object properly before accessing
* fix: Recursive types not handling optional arrays
* add user badges component
* create user badges from sso token
* update badges type
* revert src/core/client/embed/index.html
* remove duplicated line
* add user badges component
* create user badges from sso token
* revert src/core/client/embed/index.html
* remove duplicated line
* fix types
* fix tests and snaps
* add user badges to user drawer
* update snaps
* update readme
* [CORL-476] add user role from SSO token (#2475)
* add role from token
* use joi to validate role values
Co-Authored-By: Wyatt Johnson <wyattjoh@gmail.com>
* simplify sso.role validation
* add test for invalid role in sso token
* feat: enable persisted queries on the client
* fix: use `id` inside websocket message
* feat: initial server support for PQ
* feat: deeper server support
* feat: abstracted persisted query replacing logic
* Center sign in popovers in the browser window so they are always visible
* Set popover window feature by default using interfaced parameters
* Update snapshots to account for feature parameters on popup windows
* Lowercase the bar in menubar for Popup so it matches window api
* fix: externalized feature reconciliation
* add types for username updates
* add update username methods
* add types and resolvers for username history
* connect frontend to username history and change history mutation
* style update username box
* show username changes in user history drawer
* new users have 1 username entry
* add translations for username change
* allow new users to change username once
* add tests for change username ui
* send email to users after username change
* add types to tests
* treat status.username.history as mandatory
* remove hardcoded 14 day username update frequency
* use framework translation directives
* add account history action component
* clean up strings
* fix imports in change username container
* fix templates
* rename update username methods
* fix nunjucks formatting
* add warning if user missing email
* add fixme
* fix spacing
* Create preliminary UI for requesting a user's comment history
CORL-235
* Create preliminary download handler
CORL-235
* Create preliminary CSV exporter for downloading user's comments
CORL-235
* Create preliminary download comments flow with email and landing page
User can download their comments after requesting via an email.
Does not include limiters preventing users from spamming the download flow.
CORL-235
* Style the download comments landing page to match the spec
CORL-235
* Update the profile download comments to respect 14 day download limit
CORL-235
* Hook up request limiter on the comment download end points.
CORL-235
* Create sorry dialogue for when the download comments link is invalid/expired
CORL-235
* Create loading spinner for comment download landing page
CORL-235
* Create an optimistic updater for requesting a comment download
CORL-235
* Add localization for download comments landing page's sorry text
CORL-235
* Adjust downloaded comment format and contents
- Format the date to match tenant local
- Format dates to be using numeric values with date and time
- Add comment URL to exported CSV record
CORL-235
* Rename `createCSV` to `createExportedContent` in the download handler
CORL-235
* Make comment download callout full width and left justified
CORL-235
* Update stream snapshots to account for the download comments changes
CORL-235
* Update snapshots to correspond to download comments changes
CORL-235
* Add date filter to the comment download
Will filter by date of the issued token to only include comments before
that time.
CORL-235
* Clean up the layout of the list items in the download comments landing page
CORL-235
* fix: localization fixes
* fix: formatting
* fix: download file enhancements
* fix: addressed download request loophole
* Update snapshots to address button changes on download comments landing page
CORL-235
* Simplify download comment landing page components
CORL-235
* Remove max-width calc's on account main layout and set them in child views
Sets the max-width settings on the download route since it's custom
set on all the othere routes (email and password).
CORL-235
* Bump npm version in package.json
CORL-235
* show tooltip for user status details
* localize strings
* fix merge conflict
* fix date formatting in user details popover
* update snapshot
* fix rebase
* feat: add useResizeObserver hook
* fix: stream jumps when clicking on the last reply button when scrolled to the bottom
* chore: use resize observer in auth popup and simplify resize handling
* fix: snapshots and remove resize observer from stream
* fix: focus unmounted rte
* wire up suspension modal
* show user suspended callout on stream
* prevent comment actions for suspended users
* set default to 3 hour suspension
* add message field to suspension
* allow custom message for suspension
* show suspend success modal
* fix type errors
* remove unused code
* update styles
* fix fixture for streams
* add suspension ui tests
* fix types
* remove warnings?
* remove snapshot
* fix merge conflicts
* allow custom email message when banning users
* fix typo
* correct message type
* use final-form in suspend modal
* refactor suspend modal to use final-form
* refactor ban modal to use final-form
* refactor userStatusChangeContainer to use useCallback
* feat: improve translated form
* fix: addressed issue caused by i18n refactor
* update getMessage to accept arguments, remove format method
* translate suspend info
* change hour format
* make message a mandatory input for suspend and ban user
* fix types in user table
* Revert "fix types in user table"
This reverts commit d396e90b88bb1bd354c5cdbdd72b6d8f1ab72929.
* fix types for user table
* fix: small review tweaks
* Create unit tests around the user drawer
CORL-443
* Update comment fixture generation to include reason metadata, action counts
CORL-443
* Add a user status drop down to the user history drawer
CORL-227
* Refactor UserHistoryDrawer tabs and queries for consistency
CORL-234
* Create and empty account history tab in the user drawer
CORL-234
* Create preliminary account history tab queries
Massages the suspension and ban history together into a usable format.
Sorts the ban and suspension history by date, ascending.
Ready to process the history data into components to make up the future
table records.
CORL-234
* Style the user drawer account history records into table format
CORL-234
* Fix typo in admin localization around banned text
CORL-234
* Update suspension record to support templated insertion of timespan
CORL-234
* Create localized parsing of suspension times for account history
CORL-234
* Handle errors when loading the user drawer account history
CORL-234
* Adjust margins of tab content relative to the tab controls
CORL-234
* Extract suspension record time calculations out of component
CORL-234
* Handle when a user has no account history
CORL-234
* Adjust line height to prevent cutting off usernames in community table
CORL-234
* Override hover behaviour for user drawer account history rows
CORL-234
* Adjust default column widths in user drawer - account history
CORL-234
* Use react node type instead of any for component substitution
CORL-234
* Rename TabType to UserTabs
CORL-234
* Use nullable type instead of strict typing using OR's
CORL-234
* Set UserStatusChangeContainer fullWidth default to false
CORL-234
* Combine timed suspension localization into one Localized element
CORL-234
* fix: useMemo on history bar
* Rename UserHistoryDrawerAccountHistory to UserDrawerAccountHistory
Cleans up the agglutination's on these file names.
Probably means we should rename UserHistoryDrawer... to
UserDrawer... everywhere. Will get to that later.
CORL-234
* Reorder imports to match alphabetization preferences
CORL-234
* feat: simplication to action table
* feat: visual tweaks
* chore: added notes for deprecating
* Create unit tests around the user drawer
CORL-443
* Update comment fixture generation to include reason metadata, action counts
CORL-443
* Move testRenderer construction outside of act() operations
CORL-443
* Add a user status drop down to the user history drawer
CORL-227
* Update snapshots to handle status change dropdown full width styling
In other areas we want to override the full width: 100% styling of the
status change drop down. By default, we turn it on. This added a class
to the element that needs to be updated in the snapshots.
CORL-227
* Ignore the user history drawer tests for the time being
Getting an Invariant Violation: Unable to find node on an unmounted component.
when the UserStatusChangeContainer is present on the UserHistoryDrawerQuery.
CORL-227
* Align the user drawer status label and button text
CORL-227
* Update community tests to handle removal of dot icon from user status
CORL-227
* Move the user history drawer into shared location that all admin routes access
CORL-443
* Move the moderate card to the shared components for admin
CORL-443
* Add a user drawer to the community area of the admin section
CORL-443
* Touch up missing tabs in UserRow.css
CORL-443
* Create unit tests around the user drawer
CORL-443
* Move toxicity label to new shared component location to fix rebase
CORL-443
* Update comment fixture generation to include reason metadata, action counts
CORL-443
* Rename userDrawerID to userDrawerUserID
CORL-443
* Clean up imports on user drawer unit tests
CORL-443
* Add coral-test to the jest config paths
CORL-443
* Add todo around creating predictable date times for test fixtures
CORL-443
* Move testRenderer construction outside of act() operations
CORL-443
* feat: improved some password/email fields
- All secret fields are now "hidden" by default
- All email fields now have autocomplete/spellcheck disabled with
correct typings
* feat: add additional email validation
* Create preliminary user history drawer with user fragment
CORL-233
* Set font size for the user details to match spec at 16 px
CORL-233
* Update username font style/size, add horizontal rule for user history drawer
CORL-233
* Set user detail min width to align the copy buttons in user history drawer
CORL-233
* Set min width of the user history drawer to match spec
CORL-233
* Remove min width for detail area and card to allow responsive sizing
Allows the copy buttons to sit just to the right of the user
details text.
CORL-233
* Update snapshots to handle clickable username in moderation comment cards
CORL-233
* Create initial pagination of all comments in user history drawer
Shows all comments with a rubbish "load more" button as we haven't
decided if we want to do a load more button or infinite scrolling
solution.
Flex layout helps it create a scroll bar when needed to traverse through
the comment stream.
CORL-233
* Create preliminary user history drawer with user fragment
CORL-233
* Set font size for the user details to match spec at 16 px
CORL-233
* Update username font style/size, add horizontal rule for user history drawer
CORL-233
* Set user detail min width to align the copy buttons in user history drawer
CORL-233
* Set min width of the user history drawer to match spec
CORL-233
* Remove min width for detail area and card to allow responsive sizing
Allows the copy buttons to sit just to the right of the user
details text.
CORL-233
* Update snapshots to handle clickable username in moderation comment cards
CORL-233
* Let the user history drawer fill full height of page
CORL-233
* Add a close button to the user history drawer
CORL-233
* Preliminarily get all and rejected comments showing in the user drawer
CORL-233
* Create preliminary user history drawer with user fragment
CORL-233
* Set font size for the user details to match spec at 16 px
CORL-233
* Update username font style/size, add horizontal rule for user history drawer
CORL-233
* Set user detail min width to align the copy buttons in user history drawer
CORL-233
* Set min width of the user history drawer to match spec
CORL-233
* Remove min width for detail area and card to allow responsive sizing
Allows the copy buttons to sit just to the right of the user
details text.
CORL-233
* Update snapshots to handle clickable username in moderation comment cards
CORL-233
* Let the user history drawer fill full height of page
CORL-233
* Add a close button to the user history drawer
CORL-233
* Set the user history drawer to fill full height of window
CORL-233
* Convert ModerateCardContainer to a FunctionComponent
CORL-233
* Show spinner while all comments are loading in user history drawer
CORL-233
* Style tabs within the user history drawer to be secondary
CORL-233
* Center load more button in the comments for the user history drawer
CORL-233
* Fix scroll bars on nested flexboxes in the user history drawer
CORL-233
* Tweak styling for the user history drawer comments section
Add margins where necessary.
Style the Load More button to match the comment feed elsewhere.
CORL-233
* Fix background of copy buttons to match the user history drawer
CORL-233
* Preliminarily get rejected comments showing in the user history tabs
Still need to consolidate any duplication between the all and rejected
comments containers/queries, but this works correctly as is.
CORL-233
* Show hover and active background color on moderate card usernames
CORL-233
* Hide load more buttons on comment streams when no comments available
CORL-233
* Handle when no comments are available in user history drawer streams
CORL-233
* Actually show all comments in the user history all comments tab
Previously was filtering out rejected and other pre-mod
status-ed comments.
CORL-233
* Style the user history drawer cards to match the spec
CORL-233
* Add localizations around user history drawer tabs
CORL-233
* Allow a mini mode for moderate cards that are shown in the user drawer
CORL-233
* Style user drawer comment tabs to match the spec
CORL-233
* Update snapshots to account for mini moderate cards
Updates the fact that a separator on regular sized cards
now has an additional class name to turn on the divider's
visible border.
CORL-233
* Add user drawer to the queue instead of childed to the moderate card
Prevents the user drawer from prematurely closing when we approve
all items in the moderate queue.
CORL-233
* Update snapshots to account for user drawer on queues
CORL-233
* Set mini and username defaults more cleanly on ModerateCardContainer
CORL-233
* Rename usernameClicked to onUsernameClicked
CORL-233
* Use callback on loadMore calls within user drawer queries
CORL-233
* Localize the no comment text for the user drawer comment streams
CORL-233
* Localize the user not found callout in the user drawer comment streams
CORL-233
* Remove superfluous curly braces
CORL-233
* Extract user history drawer internals into a distinct query component
CORL-233
* Move comments conditional below useCallback initializations
CORL-233
* feat: fixed consistency issues
* Use a concrete tab type on user drawer comment stream tabs
CORL-233
* Use <hr/> instead of <HorizontalRule>
CORL-233
* Clarify logic for showing horizontal rule after comments in user drawer
CORL-233
* Remover bottom border on user drawer tab bar
CORL-233
* feat: support comment replies
* feat: comment created
* feat: live update top level comments
* feat: live updates on the stream embed
* fix: tests
* chore: refactor FadeInTransition
* fix: add missing translation and a live update bug
* fix: graqphql
* feat: improve loading experiene :-)
* fix: live comment bugs
* chore: adapt translation
* feat: stop live updates when story is closed or commenting is disabled
* test: add tests for stream live updates
* fix: remove forgotten piece of code
* fix: tests
* Add a ban user action to the stream moderation drop down
CORL-382
* Show banned stated for user in stream moderation drop down
If the user is actively banned, the ban user option will be
disabled and show a status of "banned".
CORL-382
* Create utility for generating random stories, comments, and users
CORL-382
* Add ban and suspension values to baseUser in fixtures
CORL-382
* Updated banned.spec.tsx to use new test utilities for generating fixture data
CORL-382
* Prevent users from being able to ban themselves in the moderation dropdown
CORL-382
* Kill optimistic response errors for comment mutations
Set the author.status.current to an empty array so it stops
complaining about it being unused.
CORL-382
* Rename util in tests to helpers/fixture.ts
CORL-382
* Remove unused import from CreateCommentReplyMutation.ts
CORL-382
* Put back the optimistic ban responses into comment mutations
The warnings spewing out during tests are false, for further
detail please see: https://github.com/facebook/relay/pull/2760
CORL-382
* Denormalize generated stories and comments
CORL-382
* Clean up import ordering in ModerationActionsContainer.tsx
CORL-382
* Inject appropriate scoped items into callbacks for moderation dropdown
CORL-382
* Set optimistic response author status from known viewer status
CORL-382
* feat: added cookie support to coral
* feat: adapt client to use cookies
* fix: safari input styles
* fix: lint
* fix: linting
* fix: support clearing cookies properly, oauth
* feat: support cookies for websocket upgrade requests
* fix: lint
* fix: tests
* feat: client implementation of subscriptions and modqueue live counts
* fix: unit tests
* feat: live status update in moderation
* feat: live update of new comments in moderation
* chore: View New instead of View More
* feat: fade in transition for new comments
* chore: turn websocket proxy back on
* feat: initial server impl
* fix: make it work :-)
* fix: add box shadow
* chore: make test subscriptions only support 1 top level field following the spec
* fix: linting
* feat: support clientID
* fix: linting
* feat: support commentStatusUpdated subscription
* fix: disabled styles for approve and reject button
* feat: show moderated by system and update flags
* feat: support metrics recording on websocket connections
* fix: handle when same comment enters but leaves again
* Preliminarily add a feature button to the moderate card
Pulls the tags for a comment and checks if any or of type "Featured".
Naively compares the tag code with the string "Featured".
Shows a featured button, but is missing localization for the text.
CORL-163
* Use GQLTag definitions from schema to compute whether comment is featured
CORL-163
* Add functionality to feature/unfeature comments in the moderation area
Hooks up the feature button to two mutations for featuring and
unfeaturing comments on moderation comment cards.
CORL-163
* Add localizations for the feature button on the moderation card
CORL-163
* Fix moderate card snapshot banned and suspect word lists
CORL-163
* Fix issue with feature buttons never showing "Featured" text
Localization on parent of the button was causing an override
in the naming of the feature button text. Removed parent
localization and let the child show the localized text values.
CORL-163
* Update moderate card snapshots with feature button
CORL-163
* Update moderate fixtures and snapshots to handle feature button
Add tags section to fixture data.
Add feature button to moderate snapshots.
CORL-163
* Set a default for feature button's localized text
CORL-163
* Add test to verify feature button is available on moderation cards
CORL-163
* Add tests to verify featured comments show featured button state in moderation
Verify that when a featured comment shows in single moderation view,
that the comment shows appropriate featured button state.
CORL-163
* Update feature button styles to use design tokens
CORL-163
* Replace true | false prop definition with boolean type
CORL-163
* Remove un-necessary beforeEach history location in feature.spec.tsx
CORL-163
* Organize styling for feature button
Move float:right with the rest of the layout options.
CORL-163
* Update the feature comment mutation moderate side to update queues
CORL-163
* Update queue counts when a comment is approved via featuring
CORL-163
* Add tests around ignore button visibility on user popover cards
Staff member -> ignore should not be present
Regular commenter -> ignore button should be present
CORL-409
* chore: simplify fixture
* chore: normalize naming in test and use type instead of any
* Throw error if user tries to ignore a staff member
Throws a UserCannotBeIgnoredError if a user tries to ignore
a user who is a staff member. A staff member in this case is
considered anyone who has a role of staff, moderator, or admin.
CORL-409
* Prevent users from ignoring staff in the user info popover
Creates the staff roles in a constant next to the user model.
Uses this to add a computed property to the user resolver.
CORL-409
* Remove unnecessary async declaration from userIsStaff helper function
CORL-409
* Specify ignoreable on users in client test fixtures
Allows the tests to pass for the required computed property
of ignoreable that is computed by whether a user is a staff
member or not.
CORL-409
* Update more fixtures with ignoreable property on mocked users/commenters
CORL-409
* Consolidate ignore-able calculation into re-usable helper methods
Re-use the logic for whether a role is a staff member to
clearly define when a user is ignore-able or not across the
business logic.
CORL-409
* Set the ignoreable optimisticResponse on comment mutations
We have set the ignoreable value in the graphQL schema, so now
the optimisticResponses are looking for a default value to use
until the data result arrives. Put to false since the ignoreable
value is set on our author, we likely don't want to ignore ourselves.
CORL-409
about:Create a bug report to help us improve Coral
labels:"bug"
---
<!--
Please note that but submitting a bug report, you agree to our Code of Conduct: http://code-of-conduct.voxmedia.com/
When submitting a bug report, 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.
Please help us by doing the following steps before logging an issue:
* Search for other similar issues: https://github.com/coralproject/talk/search
* Read our docs: https://docs.coralproject.net
Please fill in the *entire* template below.
-->
**Expected behavior:**
**Actual behavior:**
**Related Issues:**<!-- Did you find other bugs that looked similar? -->
_Viewer Network Events_ are events that involves a network request and thus can succeed or fail. Succeeding events will have a `.success` appended to the event name while failing events have an `.error` appended to the event name.
Moreover _Viewer Network Events_ contains the `rtt` field which indicates the time it needed from initiating the request until the _UI_ has been updated with the response data.
Example events:
```
createComment.success
{
body: "Hello world!",
storyID: "238b95ec-2b80-43f4-ab68-a6ea1f4e2584",
rtt: 307,
success: {
id: "6fecfb11-4d0f-4edc-89b7-878a9928addd"
status: "APPROVED"`
}
}
```
```
createComment.error
{
body: "Hi!",
storyID: "238b95ec-2b80-43f4-ab68-a6ea1f4e2584",
rtt: 229,
error: {
code: "COMMENT_BODY_TOO_SHORT"
message: "Comment body must have at least 10 characters."
}
}
```
## Event List
<!-- START docs:events -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN npm run docs:events -->
- <a id="approveComment">**approveComment.success**, **approveComment.error**</a>: This event is emitted when the viewer approves a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="banUser">**banUser.success**, **banUser.error**</a>: This event is emitted when the viewer bans a user.
```ts
{
userID: string;
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="cancelAccountDeletion">**cancelAccountDeletion.success**, **cancelAccountDeletion.error**</a>: This event is emitted when the viewer cancels the account deletion.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="changeEmail">**changeEmail.success**, **changeEmail.error**</a>: This event is emitted when the viewer changes its email.
```ts
{
oldEmail: string;
newEmail: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="changePassword">**changePassword.success**, **changePassword.error**</a>: This event is emitted when the viewer changes its password.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="changeUsername">**changeUsername.success**, **changeUsername.error**</a>: This event is emitted when the viewer changes its username.
```ts
{
oldUsername: string;
newUsername: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="closeStory">**closeStory.success**, **closeStory.error**</a>: This event is emitted when the viewer closes the story.
```ts
{
storyID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="copyPermalink">**copyPermalink**</a>: This event is emitted when the viewer copies the permalink with the button.
```ts
{
commentID: string;
}
```
- <a id="createComment">**createComment.success**, **createComment.error**</a>: This event is emitted when a top level comment is created.
```ts
{
storyID: string;
body: string;
success: {
id: string;
status: COMMENT_STATUS;
};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="createCommentFocus">**createCommentFocus**</a>: This event is emitted when the viewer focus on the RTE to create a comment.
- <a id="createCommentReaction">**createCommentReaction.success**, **createCommentReaction.error**</a>: This event is emitted when the viewer reacts to a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="createCommentReply">**createCommentReply.success**, **createCommentReply.error**</a>: This event is emitted when a comment reply is created.
```ts
{
body: string;
parentID: string;
success: {
id: string;
status: COMMENT_STATUS;
};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="editComment">**editComment.success**, **editComment.error**</a>: This event is emitted when the viewer edits a comment.
```ts
{
body: string;
commentID: string;
success: {
status: COMMENT_STATUS;
};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="featureComment">**featureComment.success**, **featureComment.error**</a>: This event is emitted when the viewer features a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="gotoModeration">**gotoModeration**</a>: This event is emitted when the viewer goes to moderation.
```ts
{
commentID: string;
}
```
- <a id="ignoreUser">**ignoreUser.success**, **ignoreUser.error**</a>: This event is emitted when the viewer ignores a user.
```ts
{
userID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="loadMoreAllComments">**loadMoreAllComments.success**, **loadMoreAllComments.error**</a>: This event is emitted when the viewer loads more top level comments into the comment stream.
```ts
{
storyID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="loadMoreFeaturedComments">**loadMoreFeaturedComments.success**, **loadMoreFeaturedComments.error**</a>: This event is emitted when the viewer loads more featured comments.
```ts
{
storyID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="loadMoreHistoryComments">**loadMoreHistoryComments.success**, **loadMoreHistoryComments.error**</a>: This event is emitted when the viewer loads more top level comments into the history comment stream.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="loginPrompt">**loginPrompt**</a>: This event is emitted when the viewer does an action that will prompt a login dialog.
- <a id="openSortMenu">**openSortMenu**</a>: This event is emitted when the viewer clicks on the sort menu.
- <a id="openStory">**openStory.success**, **openStory.error**</a>: This event is emitted when the viewer opens the story.
```ts
{
storyID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="rejectComment">**rejectComment.success**, **rejectComment.error**</a>: This event is emitted when the viewer rejects a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="removeCommentReaction">**removeCommentReaction.success**, **removeCommentReaction.error**</a>: This event is emitted when the viewer removes its reaction from a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="removeUserIgnore">**removeUserIgnore.success**, **removeUserIgnore.error**</a>: This event is emitted when the viewer remove a user from its ignored users list.
```ts
{
userID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="replyCommentFocus">**replyCommentFocus**</a>: This event is emitted when the viewer focus on the RTE to reply to a comment.
- <a id="reportComment">**reportComment.success**, **reportComment.error**</a>: This event is emitted when the viewer reports a comment.
```ts
{
reason: string;
commentID: string;
additionalDetails?: string | undefined;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="requestAccountDeletion">**requestAccountDeletion.success**, **requestAccountDeletion.error**</a>: This event is emitted when the viewer requests to delete its account.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="requestDownloadCommentHistory">**requestDownloadCommentHistory.success**, **requestDownloadCommentHistory.error**</a>: This event is emitted when the viewer requests to download its comment history.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="resendEmailVerification">**resendEmailVerification.success**, **resendEmailVerification.error**</a>: This event is emitted when the viewer request another email verification email.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="setCommentsOrderBy">**setCommentsOrderBy**</a>: This event is emitted when the viewer changes the sort order of the comments.
```ts
{
orderBy: string;
}
```
- <a id="setCommentsTab">**setCommentsTab**</a>: This event is emitted when the viewer changes the tab of the comments tab bar.
```ts
{
tab: string;
}
```
- <a id="setMainTab">**setMainTab**</a>: This event is emitted when the viewer changes the tab of the main tab bar.
```ts
{
tab: string;
}
```
- <a id="setProfileTab">**setProfileTab**</a>: This event is emitted when the viewer changes the tab of the profile tab bar.
```ts
{
tab: string;
}
```
- <a id="showAbsoluteTimestamp">**showAbsoluteTimestamp**</a>: This event is emitted when the viewer clicks on the relative timestamp to show the absolute time.
- <a id="showAllReplies">**showAllReplies.success**, **showAllReplies.error**</a>: This event is emitted when the viewer reveals all replies of a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="showAuthPopup">**showAuthPopup**</a>: This event is emitted when the viewer requests the auth popup.
```ts
{
view: string;
}
```
- <a id="showEditEmailDialog">**showEditEmailDialog**</a>: This event is emitted when the viewer opens the edit email dialog.
- <a id="showEditForm">**showEditForm**</a>: This event is emitted when the viewer opens the edit form.
```ts
{
commentID: string;
}
```
- <a id="showEditPasswordDialog">**showEditPasswordDialog**</a>: This event is emitted when the viewer opens the edit password dialog.
- <a id="showEditUsernameDialog">**showEditUsernameDialog**</a>: This event is emitted when the viewer opens the edit username dialog.
- <a id="showFeaturedCommentTooltip">**showFeaturedCommentTooltip**</a>: This event is emitted when the viewer clicks to show the featured comment tooltip.
- <a id="showIgnoreUserdDialog">**showIgnoreUserdDialog**</a>: This event is emitted when the viewer opens the ignore user dialog.
- <a id="showModerationPopover">**showModerationPopover**</a>: This event is emitted when the viewer opens the moderation popover.
```ts
{
commentID: string;
}
```
- <a id="showMoreOfConversation">**showMoreOfConversation.success**, **showMoreOfConversation.error**</a>: This event is emitted when the viewer reveals more of the parent conversation thread.
```ts
{
commentID: string | null;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="showMoreReplies">**showMoreReplies**</a>: This event is emitted when the viewer reveals new live replies.
```ts
{
commentID: string;
count: number;
}
```
- <a id="showReplyForm">**showReplyForm**</a>: This event is emitted when the viewer opens the reply form.
```ts
{
commentID: string;
}
```
- <a id="showReportPopover">**showReportPopover**</a>: This event is emitted when the viewer opens the report popover.
```ts
{
commentID: string;
}
```
- <a id="showSharePopover">**showSharePopover**</a>: This event is emitted when the viewer opens the share popover.
```ts
{
commentID: string;
}
```
- <a id="showUserPopover">**showUserPopover**</a>: This event is emitted when the viewer clicks on a username which shows the user popover.
```ts
{
userID: string;
}
```
- <a id="signOut">**signOut.success**, **signOut.error**</a>: This event is emitted when the viewer signs out.
```ts
{
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="signedIn">**signedIn**</a>: This event is emitted when the viewer signed in (not applicable for SSO).
- <a id="unfeatureComment">**unfeatureComment.success**, **unfeatureComment.error**</a>: This event is emitted when the viewer unfeatures a comment.
```ts
{
commentID: string;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="updateNotificationSettings">**updateNotificationSettings.success**, **updateNotificationSettings.error**</a>: This event is emitted when the viewer updates its notification settings.
- <a id="updateStorySettings">**updateStorySettings.success**, **updateStorySettings.error**</a>: This event is emitted when the viewer updates the story settings.
This code of conduct governs the environment of the Vox Product team. We created it not because we anticipate bad behavior, but because we believe that articulating our values and obligations to one another reinforces the already exceptional level of respect among the team and because having a code provides us with clear avenues to correct our culture should it ever stray from that course. We make this code public in the hopes of contributing to the ongoing conversation about inclusion in the tech, design, and media communities and encourage other teams to fork it and make it their own. To our team, we commit to enforce and evolve this code as our team grows.
Read the rest here: http://code-of-conduct.voxmedia.com/
Typically these take the form of creating a Pull Request for Coral, and
submitting it to be reviewed by a member of our team and the greater Coral
community.
Working on your first Pull Request? You can learn how from this free video
series:
[How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github)
If you decide to fix an issue, please be sure to check the comment thread in
case somebody is already working on a fix. If nobody is working on it at the
moment, please leave a comment stating that you intend to work on it so other
people don’t accidentally duplicate your effort.
If somebody claims an issue but doesn’t follow up for more than two weeks, it’s
fine to take it over but you should still leave a comment.
## Writing Code
Conversation surrounding contributions begins when you can create an issue
describing your issue or suggestion.
### When should I create an issue?
File an issue as soon as you have an idea of something you'd like to contribute.
We would love to hear what you're thinking and help refine the idea to make it
into the Coral ecosystem.
### What should I include in my issue?
Coral has adopted an iterative, agile development philosophy. All contributions
that make it into the Coral repository should start with a user story in this
form:
> As a [type of Coral user] I'd like to [do something] so that I can [get some result/value].
This exercise does two things:
- Allows us to ground our technical choices in a clear, simple product need.
- Expresses that product need in a way that doesn't imply a specific technical
solution allowing for debate as to the best way to solve the problem.
Please feel free to provide as much detail as possible when filing the issue but
please do keep the initial issue specific to one need and try to avoid including
technical or design solutions.
If you have a specific technical or design solution in mind, please submit it as
the first comment on the thread.
### When should I create a pull request?
File a pull request if you've created an issue in our [issues](https://github.com/coralproject/talk/issues)
page and have heard back from a member or contributor to Coral. This allows our
team to review the proposed changes prior to time being spent if the team
already has the feature/fix in the road map.
### What should I include in my pull request?
When you create a pull request, the template will describe the required
components needed for it to be reviewed by a member of the Coral team. You
should end up filling out:
- What does this PR (pull request) do?
- How do I test this PR?
You should describe what Github issue or ticket that the PR is associated with
to assist the review process. If this PR is resolving a particular bug, a
testing strategy should be described in the testing section. If this PR is
contributing a new feature, a description should describe a scenario to test or
verify the new functionality.
## Reviewing pull requests
Reviewing pull requests in Coral is generally completed by the core Coral team
that is composed of developers employed by Vox Media Inc, but external reviews
or suggestions are also welcomed.
Our review process generally follows a few core principles:
### Ensure contributions are linted and tested
It is the job of CI linting and tests to notify of style issues within the
codebase. If it is not possible for style issues to be encapsulated as a
linting rule, it shouldn't be concretely enforced during the review process.
This can ensure that code reviews contain more meaningful feedback tied to the
contribution rather than nit-picking on stylistic choices.
Reviewers must ensure that linting and tests pass in CI and locally prior to a
review taking place. You can do this by running `npm run generate` followed by
`npm run lint` and `npm run test`.
### Review the feature/fixes
Any new features added to Coral should be reviewed for bugs through a manual
verification process to ensure that they function on your machine. If possible
you should review any automated tests that were added (or not added) related to
the feature.
While the Coral team is not strict on test driven development (or TDD), any
contributions that include tests are greatly appreciated, and preferred over
those that do not.
### Review architectural decisions
Any substantial changes made to the codebase should be reviewed to ensure
that they conform to the current way code/services are laid out.
Architecture Decision Records (or [ADR](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions)) are now being used to describe architectural decisions and can be found in the `src/docs/architecture/decisions` directory.
### Verify localizations
While we don't have any automated tools at the time of writing that will
verify this in CI, any stringsbeing added that are presented to the end user
should be wrapped in localization components to support other languages.
## Localization
We use the [fluent](http://projectfluent.org/) library and store our
translations in [FTL](http://projectfluent.org/fluent/guide/) files in
`src/locales/` and `src/core/server/locales/`.
Strings are added or removed from localization bundles in the translation files
as needed. Strings **MUST NOT** be _changed_ after they've been committed and
pushed to master. Changing a string requires creating a new ID with a new name
(preferably descriptive instead of incremented) and deletion of the obsolete ID.
It's often useful to add a comment above the string with info about how and
where the string is used.
Once a language has enough coverage, it should be added to
`src/core/common/helpers/i18n/locales.ts`.
The [Perspective API](https://github.com/conversationai/perspectiveapi/blob/master/2-api/methods.md#analyzecomment-request)
also supports comments in specific languages. When the language is supported in
Coral and supported by the Perspective API, the language should be added to the
language map in `src/core/server/services/comments/pipeline/phases/toxic.ts`.
To assist with the translation process, we have a script that is based on the
work by @cristiandean in https://github.com/coralproject/talk/pull/2949 that
will detect missing, new, or changed translation keys for the specified
language. You can use this with:
```sh
# usage: ./scripts/i18n/validate.ts <locale>
./scripts/i18n/validate.ts pt-BR
```
## Documentation
Documentation that is publicly shown on
[docs.coralproject.net](https://docs.coralproject.net/coral/) is stored under
the `release/4` branch as it contains information for versions 4.0 onwards of
Coral.
To contribute new docs, you can either click the "Suggest Edits" in the top
right of each page, or you can edit directly via source. We suggest that for
individual fixes or contributions to the documentation.
If you want to contribute via source files, you can follow the procedure
outlined below:
1. Clone the Talk repository via `git clone https://github.com/coralproject/talk.git`
2. Switch to the `release/4` branch via `git checkout release/4`
3. Follow the procedure outlined on that branch's [CONTRIBUTING.md](https://github.com/coralproject/talk/blob/release/4/CONTRIBUTING.md#contributing-documentation) file for contributing documentation changes
4. Create a pull request to merge your changes back into the `release/4` branch
## Design Principles
### GraphQL
Coral relies heavily on [GraphQL](https://graphql.org) as the query language for
the API and the runtime on the server that powers resolving data from data
sources. This heavily influences a lot of the decisions around how we create and
consume it's API internally and how we expose it to others to interact with.
There are many GraphQL types in our [`schema.graphql`](https://github.com/coralproject/talk/blob/master/src/core/server/graph/schema/schema.graphql)
that define the way we handle data in our API. We'll try to outline a few of
them here with examples to help you understand their uses.
#### Types
Similar to defining an interface or a _struct_ definition, GraphQL has flexible
types that can be used to define data types that are used for querying data from
the API. This retrieval can happen directly via a query, or after executing an
action using a mutation and querying its response result.
An example of these types is the `Comment` and its nested `CommentRevision`
type:
```graphql
"""
Comment is a comment left by a User on an Story or another Comment as a reply.
"""
typeComment{
"""
id is the identifier of the Comment.
"""
id:ID!
"""
body is the content of the Comment, and is an alias to the body of the
`revision.body`.
"""
body:String
"""
revision is the current revision of the Comment's body.
"""
revision:CommentRevision
"""
revisionHistory stores the previous CommentRevision's, with the most recent
edit last.
"""
revisionHistory:[CommentRevision!]!
@auth(
roles:[MODERATOR,ADMIN]
userIDField:"author_id"
permit:[SUSPENDED,BANNED,PENDING_DELETION]
)
"""
status represents the Comment's current status.
"""
status:COMMENT_STATUS!
}
```
Notice how the `Comment` type can nest more custom defined types. A `Comment`
can have a current `CommentRevision` named `revision`. It also has a list of its
historical `revisionHistory`:
```graphql
typeCommentRevision{
"""
id is the identifier of the CommentRevision.
"""
id:ID!
"""
comment is the reference to the original Comment associated with the current
Comment.
"""
comment:Comment!
"""
actionCounts stores the counts of all the actions for the CommentRevision
Mutations are a request to GraphQL to initiate an action which will result in a response. As such,they're broken up into an `Input` and `Payload` pair that matches a mutation's request and response pair.
An example is the `CreateCommentInput` and `CreateCommentPayload`:
```graphql
"""
CreateCommentInput provides the input for the createComment Mutation.
"""
inputCreateCommentInput{
"""
storyID is the ID of the Story where we are creating a comment on.
"""
storyID:ID!
"""
nudge when true will instead return an error related to recoverable moderation
faults such as a toxic comment or spam comment to provide user feedback to
nudge the user to correct the comment.
"""
nudge:Boolean=false
"""
body is the Comment body, the content of the Comment.
"""
body:String!
"""
clientMutationId is required for Relay support.
"""
clientMutationId:String!
}
"""
CreateCommentPayload contains the created Comment after the createComment
mutation.
"""
typeCreateCommentPayload{
"""
edge is the possibly created comment edge.
"""
edge:CommentEdge!
"""
clientMutationId is required for Relay support.
"""
clientMutationId:String!
}
```
The `CreateCommentInput` type contains some parameters that allow us to execute
the mutation. These are:
-`storyID` - the story we are submitting the comment to.
-`body` - the body of our comment.
-`nudge` - whether we should return validation prompts to the user about
improper comment language.
-`clientMutationId` - the identifier used by Relay to identify this mutation,
our front-end state cache to process the mutation request. This is the only
place in the code-base that we do not capitalize the acronym when written in
camel-case, this is unfortunately due to legacy reasons from within Relay.
The returned response for a mutation is a what we call a Payload, in this case
it's `CreateCommentPayload`. This usually has a response that is the full data
type of whatever was modified by the earlier called mutation action. The
properties on this type are:
-`edge` - we return the full comment edge that was created by the previous
input. This is done so that the mutation request can query whatever it needs
to from the returned input to update state on the client.
-`clientMutationId` - an identifier used by Relay (our front-end client state
cache) to process the mutation request.
#### Access Permissions On Types
Sometimes, you only want specific users to be allowed to view certain
information. For instance, we have roles that are defined in our schema so we
can filter who can have access to what.
These roles are used with directives on our schema that GraphQL then enforces
when trying to resolve requests a user makes. If the user has the specified role
associated with their signed-in account, they are given access to the requested
data.
An example of this is the `revisionHistory` on the `Comment` type:
```graphql
fragmentonComment{
"""
revisionHistory stores the previous CommentRevision's, with the most recent
edit last.
"""
revisionHistory:[CommentRevision!]!
@auth(
roles:[MODERATOR,ADMIN]
userIDField:"author_id"
permit:[SUSPENDED,BANNED,PENDING_DELETION]
)
}
```
Here we see the `@auth` directive. It has documentation describing the various
parameters allowed located in the [`schema.graphql`](https://github.com/coralproject/talk/blob/master/src/core/server/graph/schema/schema.graphql)
file, we'll discuss below what this particular set of parameters can be read as:
- The roles that are allowed to access this information are `MODERATOR` and
`ADMIN` as defined by the `roles` argument.
- We let the directive know that the author of the comment is `author_id` from
the `Comment` by defining the `userIDField`. It's a rule of thumb in Coral if
the Author created the document, they have permission to view it. A Comment
for example is authored by a user, with the underlying field associated with
the id of that author living on the `author_id` field. You can see how this
is related if you look at the resolver for the `Comment` type to see that it
is based off of the `Comment` interface from `src/core/server/models/comment`.
- We permit returning comments when the author has the following conditions
associated with their account: `SUSPENDED`, `BANNED`, or `PENDING_DELETION`.
These directives can be simpler, for example the `metadata` property on the
Here we see an auth directive with only roles defined. This is sufficient to
make sure that the metadata property is only accessible to `ADMIN` and
`MODERATOR` user roles.
Note: Wondering how the user roles are defined? They're simply an enumeration
type that is also defined in the schema.
```graphql
enumUSER_ROLE{
COMMENTER
STAFF
MODERATOR
ADMIN
}
```
#### Arrays of Items
Sometimes you don't want a singular property, your property is instead a
collection of items.
The `revisionHistory` from the `Comment` is again useful as an example:
```graphql
fragmentonComment{
"""
revisionHistory stores the previous CommentRevision's, with the most recent
edit last.
"""
revisionHistory:[CommentRevision!]!
}
```
The interior type `CommentRevision` is required using the `!` and the outer
array is also required using `!`.
We do this for a couple of reasons:
- This ensures that we do not return null/undefined values within the array.
- Why would we return a null when we can just return nothing for null values?
- We want the array to always be defined, if empty, we return and empty array (i.e. `[]`).
- This can be handled nicely in our resolvers. We simply check if the retrieved values is null or undefined and simply return an empty array in its stead.
These little tweaks aren't necessary, but they ease the use of our API by making
the results for arrays predictable and strongly typed.
#### Documenting
As you may have noticed, there is quite a bit of documentation in the schema examples listed here.
We typically follow these two rules in commenting our GraphQL types:
- Always comment the property within a type describing its purpose on its parent type
i.e. `createdAt` on our `Setting` type:
```graphql
fragment on Setting {
"""
createdAt is the time that the Settings was created at.
"""
createdAt: Time! @auth(roles: [ADMIN])
}
```
- Always comment the purpose of each type
i.e. the `Comment` type:
```graphql
"""
Comment is a comment left by a User on an Story or another Comment as a reply.
Coral defines a set of CSS Variables that you can use to broadly customize the
look and feel of your comment stream. For example you can easily redefine the colors
or fonts that are being used.
To change the CSS Variables, use the following example in your custom CSS file:
```
:root {
--font-family-primary: 'Verdana';
--round-corners: 0px;
}
```
The following list contains the CSS Variables that can be customized.
**Info**: *Before 6.3.0 Coral uses a different set of CSS Variables. If you are still using
the old CSS Variables, please upgrade. Currently we have a compatibility layer to bridge the old CSS Variables to the new ones. This mechanism will be removed in the future.*
<!-- START docs:css-variables -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN npm run docs:css-variables -->
This document is in reference to external moderation phases emitted by Coral.
You can configure external moderation phases on your installation of Coral by
visiting `/admin/configure/moderation/phases`.
Once you've configured a external moderation phase in Coral, you will start to
receive moderation requests in the form of a
[External Moderation Requests](#external-moderation-request) at the provided
callback URL. These will be in the form of `POST` requests with a `JSON`
payload.
When a comment is created or edited, it will be processed by moderation phases in
a predefined order. Any external moderation phase is run last, and only if all
other moderation phases before it do not return a status. The current set of
moderation phases is listed in order [here](https://github.com/coralproject/talk/blob/master/src/core/server/services/comments/pipeline/phases/index.ts).
Once you have received a moderation request, you must respond within the
provided timeout else the phase will be skipped and it will continue. It is
strongly recommended to [verify the request signature](#request-signing).
The external moderation phase must respond with one of the following:
1. Do not moderate the comment, and return a 204 without a body.
2. Perform a moderation action and return a 200 with a [External Moderation Response](#external-moderation-response)
as a `JSON` encoded body containing the operations you want to perform on the
comment.
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
Running Coral with default settings assumes that you have:
- MongoDB >=3.6 running on `127.0.0.1:27017`
- Redis >=3.2 running on `127.0.0.1:6379`
If you don't already have these databases running, you can execute the following
assuming you have Docker installed on your local machine:
```bash
docker run -d -p 27017:27017 --restart always --name mongo mongo:3.6
docker run -d -p 6379:6379 --restart always --name redis redis:3.2
```
Then start Coral with:
```bash
# Run the server in development mode in order to facilitate auto-restarting and
# rebuilding when file changes are detected. This might take a while to fully run.
npm run watch
```
When the client code has been built, navigate to http://localhost:8080/install
to start the installation wizard. **Note: Ensure `localhost:8080` is used in the permitted domains list.**
To see the comment stream goto http://localhost:8080/.
To run linting and tests use the following commands:
```bash
# Run the linters.
npm run lint
# Run our unit and integration tests.
npm run test
```
#### Email
To test out the email sending functionality, you can run [inbucket](https://www.inbucket.org/)
which provides a test SMTP server that can visualize emails in the browser:
```bash
docker run -d --name inbucket -p 2500:2500 -p 9000:9000 inbucket/inbucket
```
You can then configure the email server on Coral by updating the Tenant with:
```js
{
// ...
"email":{
"enabled":true,
"smtpURI":"smtp://localhost:2500",
"fromAddress":"community@test.com"
},
// ...
}
```
Restarting Coral will be needed. Navigate to http://localhost:9000, click the
"Monitor" tab. New emails received on this screen.
#### Design Language System (UI Components)
We use [docz](https://docz.site) to document and develop our Design Language System. To start docz run:
```bash
# Make sure CSS types are generated.
# This is not required when `npm run watch` is already running.
npm run generate:css-types
# Run docz in development.
npm run docz -- dev
```
After compilation has finished you can access docz at http://localhost:3030/.
## Configuration
The following environment variables can be set to configure the Coral Server. You
can expose them in your shell via `export NODE_ENV=development` or by placing
the variables in a `.env` file in the root of the project in a simple
`NODE_ENV=development` format delimited by newlines.
-`NODE_ENV` - Can be one of `production` or `development`. All production
deployments should use `production`. Defaults to `production` when ran with
`npm run start` and `development` when run with `npm run start:development`.
-`PORT` - The port to listen for HTTP and Websocket requests. (Default `3000`)
-`MONGODB_URI` - The MongoDB database URI to connect to.
(Default `mongodb://127.0.0.1:27017/coral`)
-`REDIS_URI` - The Redis database URI to connect to.
(Default `redis://127.0.0.1:6379`)
-`REDIS_OPTIONS` - A JSON string with optional configuration options to be used
when connecting to Redis as specified in the [ioredis](https://github.com/luin/ioredis/blob/1dac50a63753c2afc969315cfe38faf0edc50bc5/API.md#new_Redis_new) documentation.
(Default: `{}`)
-`SIGNING_SECRET` - The shared secret to use to sign JSON Web Tokens (JWT) with
the selected signing algorithm. 🚨 **Don't forget to set this variable!** 🚨
(Default: `keyboard cat`)
-`SIGNING_ALGORITHM` - The signing algorithm to use for signing JWT's.
(Default `HS256`).
-`LOGGING_LEVEL` - The logging level that can be set to one of `fatal`,
`error`, `warn`, `info`, `debug`, or `trace`. (Default `info`)
-`STATIC_URI` - The URI that static assets can be accessed from. This URI can
be to a proxy that uses this Coral server on `PORT` as the upstream. Disabled
by default.
-`DISABLE_TENANT_CACHING` - When `true`, all tenants will be loaded from the
database when needed rather than keeping a in-memory copy in sync via
published events on Redis. (Default `false`)
-`DISABLE_MONGODB_AUTOINDEXING` - When `true`, Coral will not perform indexing
operations when it starts up. This can be desired when you've already
installed Coral on the target MongoDB, but want to improve start performance.
(Default `false`)
-`LOCALE` - Specify the default locale to use for all requests without a locale
specified. (Default `en-US`)
-`ENABLE_GRAPHIQL` - When `true`, it will enable the `/graphiql` even in
production, use with care. (Default `false`)
-`CONCURRENCY` - The number of worker nodes to spawn to handle web traffic,
this should be tied to the number of CPU's available. (Default
`os.cpus().length`)
-`DEV_PORT` - The port where the Webpack Development server is running on.
(Default `8080`)
-`METRICS_USERNAME` - The username for _Basic Authentication_ at the `/metrics` and `/cluster_metrics`
endpoint.
-`METRICS_PASSWORD` - The password for _Basic Authentication_ at the `/metrics` and `/cluster_metrics`
endpoint.
-`CLUSTER_METRICS_PORT` - If `CONCURRENCY` is more than `1`, the metrics are provided at this port under `/cluster_metrics`. (Default `3001`)
If you are interested in contributing to Coral, check out our [Contributor's Guide](CONTRIBUTING.md).
## License
Coral is released under the [Apache License, v2.0](/LICENSE).
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.