diff --git a/.release-please-manifest.json b/.release-please-manifest.json index be0ab283b23..5bea498bfc6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "8.23.8" + ".": "8.24.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b448f0890..d0f2fcf6a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,25 @@ This project adheres to [Semantic Versioning](http://semver.org/). This CHANGELOG follows conventions [outlined here](http://keepachangelog.com/). +## [8.24.0](https://github.com/ParabolInc/parabol/compare/v8.23.8...v8.24.0) (2025-02-05) + + +### Added + +* **Mattermost Plugin:** TipTap Editor for Task and Reflection ([#10796](https://github.com/ParabolInc/parabol/issues/10796)) ([9e4a14e](https://github.com/ParabolInc/parabol/commit/9e4a14e54726af7d156593128d9a682ad390a627)) +* release standups ai to all users ([#10724](https://github.com/ParabolInc/parabol/issues/10724)) ([260daf3](https://github.com/ParabolInc/parabol/commit/260daf3141cf67809b03fe9a764bc06e6f3b0700)) + + +### Fixed + +* update the logic to match the definition of an active team with Data Sanctum ([#10790](https://github.com/ParabolInc/parabol/issues/10790)) ([9c1df05](https://github.com/ParabolInc/parabol/commit/9c1df054457e894cde5bbb24fc01dba3d27b2030)) + + +### Changed + +* add extra logging to gql executor timeouts ([#10795](https://github.com/ParabolInc/parabol/issues/10795)) ([7ff31b1](https://github.com/ParabolInc/parabol/commit/7ff31b156ba0ebb9c7308dea51a77c34ae7f748c)) +* Refactor tiptap events ([#10800](https://github.com/ParabolInc/parabol/issues/10800)) ([4383430](https://github.com/ParabolInc/parabol/commit/4383430ac97238dfa9a58a5c042161908f370eff)) + ## [8.23.8](https://github.com/ParabolInc/parabol/compare/v8.23.7...v8.23.8) (2025-02-04) diff --git a/package.json b/package.json index 9ecf73b6c1b..434634975b7 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "An open-source app for building smarter, more agile teams.", "author": "Parabol Inc. (http://github.com/ParabolInc)", "license": "AGPL-3.0", - "version": "8.23.8", + "version": "8.24.0", "repository": { "type": "git", "url": "https://github.com/ParabolInc/parabol" diff --git a/packages/chronos/package.json b/packages/chronos/package.json index 3be84e9e240..71fb9481df4 100644 --- a/packages/chronos/package.json +++ b/packages/chronos/package.json @@ -1,6 +1,6 @@ { "name": "chronos", - "version": "8.23.8", + "version": "8.24.0", "description": "A cron job scheduler", "author": "Matt Krick ", "homepage": "https://github.com/ParabolInc/parabol/tree/master/packages/chronos#readme", @@ -25,6 +25,6 @@ }, "dependencies": { "cron": "^2.3.1", - "parabol-server": "8.23.8" + "parabol-server": "8.24.0" } } diff --git a/packages/client/components/DiscussionThreadInput.tsx b/packages/client/components/DiscussionThreadInput.tsx index ca256b78cad..d706ddd5d03 100644 --- a/packages/client/components/DiscussionThreadInput.tsx +++ b/packages/client/components/DiscussionThreadInput.tsx @@ -130,7 +130,7 @@ const DiscussionThreadInput = (props: Props) => { if (submitting || !editor || editor.isEmpty) return addComment(JSON.stringify(editor.getJSON())) }) - const {editor, setLinkState, linkState} = useTipTapCommentEditor(initialContent, { + const {editor} = useTipTapCommentEditor(initialContent, { readOnly: !allowComments, atmosphere, teamId, @@ -216,8 +216,6 @@ const DiscussionThreadInput = (props: Props) => { diff --git a/packages/client/components/NullableTask/NullableTask.tsx b/packages/client/components/NullableTask/NullableTask.tsx index c9218dd8e52..25b29945e57 100644 --- a/packages/client/components/NullableTask/NullableTask.tsx +++ b/packages/client/components/NullableTask/NullableTask.tsx @@ -57,7 +57,7 @@ const NullableTask = (props: Props) => { const atmosphere = useAtmosphere() const isArchived = isTaskArchived(tags) const readOnly = isTempId(taskId) || isArchived || !!isDraggingOver || isIntegration - const {editor, linkState, setLinkState} = useTipTapTaskEditor(content, { + const {editor} = useTipTapTaskEditor(content, { atmosphere, teamId, readOnly @@ -70,8 +70,6 @@ const NullableTask = (props: Props) => { area={area} className={className} editor={editor} - linkState={linkState} - setLinkState={setLinkState} isDraggingOver={isDraggingOver} isAgenda={isAgenda} task={task} diff --git a/packages/client/components/ParabolScopingSearchResultItem.tsx b/packages/client/components/ParabolScopingSearchResultItem.tsx index 4ad2c0cabbd..00150584c27 100644 --- a/packages/client/components/ParabolScopingSearchResultItem.tsx +++ b/packages/client/components/ParabolScopingSearchResultItem.tsx @@ -70,7 +70,7 @@ const ParabolScopingSearchResultItem = (props: Props) => { const atmosphere = useAtmosphere() const {onCompleted, onError, submitMutation, submitting} = useMutationProps() const isEditingThisItem = !plaintextContent - const {editor, linkState, setLinkState} = useTipTapTaskEditor(content, { + const {editor} = useTipTapTaskEditor(content, { atmosphere, teamId, readOnly: !isEditingThisItem @@ -140,12 +140,7 @@ const ParabolScopingSearchResultItem = (props: Props) => { addTaskChild('root') }} > - useTaskChild('editor-link-changer')} - /> + useTaskChild('editor-link-changer')} /> ) diff --git a/packages/client/components/PokerEstimateHeaderCardParabol.tsx b/packages/client/components/PokerEstimateHeaderCardParabol.tsx index 5280d62c161..b9ea6b1f5c4 100644 --- a/packages/client/components/PokerEstimateHeaderCardParabol.tsx +++ b/packages/client/components/PokerEstimateHeaderCardParabol.tsx @@ -90,7 +90,7 @@ const PokerEstimateHeaderCardParabol = (props: Props) => { } UpdateTaskMutation(atmosphere, {updatedTask}, {}) }) - const {editor, linkState, setLinkState} = useTipTapTaskEditor(content, { + const {editor} = useTipTapTaskEditor(content, { atmosphere, teamId, onBlur @@ -108,8 +108,6 @@ const PokerEstimateHeaderCardParabol = (props: Props) => { useTaskChild('editor-link-changer')} /> diff --git a/packages/client/components/ReflectionCard/ReflectionCard.tsx b/packages/client/components/ReflectionCard/ReflectionCard.tsx index 6b4718a8e70..183cb5c9c3d 100644 --- a/packages/client/components/ReflectionCard/ReflectionCard.tsx +++ b/packages/client/components/ReflectionCard/ReflectionCard.tsx @@ -186,7 +186,7 @@ const ReflectionCard = (props: Props) => { phases, isSpotlightSource ) - const {editor, linkState, setLinkState} = useTipTapReflectionEditor(content, { + const {editor} = useTipTapReflectionEditor(content, { atmosphere, teamId, readOnly: !!readOnly @@ -332,8 +332,6 @@ const ReflectionCard = (props: Props) => { readOnly ? (phaseType === 'discuss' ? 'select-text' : 'select-none') : undefined )} editor={editor} - linkState={linkState} - setLinkState={setLinkState} onFocus={handleEditorFocus} onBlur={handleEditorBlur} /> diff --git a/packages/client/components/ReflectionGroup/RemoteReflection.tsx b/packages/client/components/ReflectionGroup/RemoteReflection.tsx index b42083f5f15..f1d77bd0706 100644 --- a/packages/client/components/ReflectionGroup/RemoteReflection.tsx +++ b/packages/client/components/ReflectionGroup/RemoteReflection.tsx @@ -1,8 +1,8 @@ import {keyframes} from '@emotion/core' import styled from '@emotion/styled' +import {generateHTML} from '@tiptap/core' import graphql from 'babel-plugin-relay/macro' -import * as React from 'react' -import {RefObject, useEffect, useMemo, useRef} from 'react' +import {RefObject, useEffect, useMemo, useRef, useState} from 'react' import {commitLocalUpdate, useFragment} from 'react-relay' import useSpotlightResults from '~/hooks/useSpotlightResults' import {RemoteReflection_meeting$key} from '../../__generated__/RemoteReflection_meeting.graphql' @@ -11,17 +11,16 @@ import { RemoteReflection_reflection$key } from '../../__generated__/RemoteReflection_reflection.graphql' import useAtmosphere from '../../hooks/useAtmosphere' -import {useTipTapReflectionEditor} from '../../hooks/useTipTapReflectionEditor' +import {serverTipTapExtensions} from '../../shared/tiptap/serverTipTapExtensions' import {Elevation} from '../../styles/elevation' import {BezierCurve, DragAttribute, ElementWidth, Times, ZIndex} from '../../types/constEnums' import {DeepNonNullable} from '../../types/generics' -import {cn} from '../../ui/cn' import {VOTE} from '../../utils/constants' import {getMinTop} from '../../utils/retroGroup/updateClonePosition' -import {TipTapEditor} from '../promptResponse/TipTapEditor' import ReflectionCardAuthor from '../ReflectionCard/ReflectionCardAuthor' import ReflectionCardRoot from '../ReflectionCard/ReflectionCardRoot' import getBBox from '../RetroReflectPhase/getBBox' +import HTMLReflection from '../RetroReflectPhase/HTMLReflection' import UserDraggingHeader, {RemoteReflectionArrow} from '../UserDraggingHeader' const circleAnimation = (transform?: string) => keyframes` @@ -214,7 +213,7 @@ const RemoteReflection = (props: Props) => { RemoteReflection_reflection$data['remoteDrag'] > const ref = useRef(null) - const {editor} = useTipTapReflectionEditor(content, {readOnly: true}) + const [html] = useState(() => generateHTML(JSON.parse(content), serverTipTapExtensions)) const timeoutRef = useRef(0) const atmosphere = useAtmosphere() const spotlightResultGroups = useSpotlightResults(meeting) @@ -253,11 +252,22 @@ const RemoteReflection = (props: Props) => { } }, [remoteDrag, meetingMembers]) - if (!remoteDrag || !editor) return null + if (!remoteDrag) return null const {dragUserId, dragUserName, isSpotlight} = remoteDrag const {nextStyle, transform, minTop} = getStyle(remoteDrag, isDropping, isSpotlight, style) - const {headerTransform, arrow} = getHeaderTransform(ref, minTop) + const [arrow, setArrow] = useState('arrow_downward') + const [headerTransform, setHeaderTransform] = useState(undefined) + + useEffect(() => { + requestAnimationFrame(() => { + const nextVal = getHeaderTransform(ref, minTop) + if (nextVal.headerTransform !== headerTransform) { + setHeaderTransform(nextVal.headerTransform) + setArrow(nextVal.arrow) + } + }) + }, []) return ( <> { > {!headerTransform && } - + {disableAnonymity && ( {creator?.preferredName} )} diff --git a/packages/client/components/ResponseReplied.tsx b/packages/client/components/ResponseReplied.tsx index e44dbc63fa0..61964a8ebe2 100644 --- a/packages/client/components/ResponseReplied.tsx +++ b/packages/client/components/ResponseReplied.tsx @@ -46,7 +46,7 @@ const ResponseReplied = (props: Props) => { history.push(`/meet/${meetingId}/responses?responseId=${encodeURIComponent(response.id)}`) } - const {editor, setLinkState, linkState} = useTipTapCommentEditor(comment.content, { + const {editor} = useTipTapCommentEditor(comment.content, { readOnly: true }) if (!editor) return null @@ -59,7 +59,7 @@ const ResponseReplied = (props: Props) => { action={} >
- +
) diff --git a/packages/client/components/RetroReflectPhase/HTMLReflection.tsx b/packages/client/components/RetroReflectPhase/HTMLReflection.tsx new file mode 100644 index 00000000000..078e18d98a0 --- /dev/null +++ b/packages/client/components/RetroReflectPhase/HTMLReflection.tsx @@ -0,0 +1,23 @@ +import {cn} from '../../ui/cn' + +interface Props { + html: string + disableAnonymity: boolean +} + +export const HTMLReflection = (props: Props) => { + const {html, disableAnonymity} = props + return ( +
+
+
+ ) +} + +export default HTMLReflection diff --git a/packages/client/components/RetroReflectPhase/PhaseItemEditor.tsx b/packages/client/components/RetroReflectPhase/PhaseItemEditor.tsx index 6ab44e95a98..d861b5d65bb 100644 --- a/packages/client/components/RetroReflectPhase/PhaseItemEditor.tsx +++ b/packages/client/components/RetroReflectPhase/PhaseItemEditor.tsx @@ -17,6 +17,7 @@ import {cn} from '../../ui/cn' import ReflectionCardAuthor from '../ReflectionCard/ReflectionCardAuthor' import ReflectionCardRoot from '../ReflectionCard/ReflectionCardRoot' import {TipTapEditor} from '../promptResponse/TipTapEditor' +import HTMLReflection from './HTMLReflection' import {ReflectColumnCardInFlight} from './PhaseItemColumn' import getBBox from './getBBox' @@ -125,7 +126,7 @@ const PhaseItemEditor = (props: Props) => { setTimeout(removeCardInFlight(content), FLIGHT_TIME) }) }) - const {editor, linkState, setLinkState} = useTipTapReflectionEditor( + const {editor} = useTipTapReflectionEditor( JSON.stringify({type: 'doc', content: [{type: 'paragraph'}]}), { atmosphere, @@ -201,8 +202,6 @@ const PhaseItemEditor = (props: Props) => { disableAnonymity ? 'pb-0' : 'pb-3' )} editor={editor} - linkState={linkState} - setLinkState={setLinkState} onBlur={onBlur} onFocus={onFocus} /> @@ -221,17 +220,7 @@ const PhaseItemEditor = (props: Props) => { isStart={card.isStart} onTransitionEnd={removeCardInFlight(card.key)} > -
-
-
+ {disableAnonymity && ( {viewerMeetingMember?.user.preferredName} diff --git a/packages/client/components/ThreadedCommentBase.tsx b/packages/client/components/ThreadedCommentBase.tsx index f1c08a699ee..f1625e586e3 100644 --- a/packages/client/components/ThreadedCommentBase.tsx +++ b/packages/client/components/ThreadedCommentBase.tsx @@ -110,7 +110,7 @@ const ThreadedCommentBase = (props: Props) => { editor?.setEditable(false) }) - const {editor, setLinkState, linkState} = useTipTapCommentEditor(content, { + const {editor} = useTipTapCommentEditor(content, { readOnly: true, atmosphere, teamId, @@ -179,12 +179,7 @@ const ThreadedCommentBase = (props: Props) => { /> {isActive && (
- +
)} {isActive && ( diff --git a/packages/client/components/promptResponse/BubbleMenuButton.tsx b/packages/client/components/promptResponse/BubbleMenuButton.tsx index 9ad74aa8257..6e896eb30f4 100644 --- a/packages/client/components/promptResponse/BubbleMenuButton.tsx +++ b/packages/client/components/promptResponse/BubbleMenuButton.tsx @@ -11,7 +11,7 @@ export const BubbleMenuButton = (props: Props) => {