diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 5d9991bcbf..d2704738b7 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -1338,10 +1338,12 @@ def duplicate(self, request, *args, **kwargs): document=duplicated_document, ) - return drf_response.Response( - {"id": str(duplicated_document.id)}, status=status.HTTP_201_CREATED + serializer = serializers.DocumentSerializer( + duplicated_document, context=self.get_serializer_context() ) + return drf_response.Response(serializer.data, status=status.HTTP_201_CREATED) + def _duplicate_document( self, document_to_duplicate, @@ -1369,7 +1371,7 @@ def _duplicate_document( user_role = document_to_duplicate.get_role(user) is_owner_or_admin = user_role in models.PRIVILEGED_ROLES - base64_yjs_content = document_to_duplicate.content + base64_yjs_content = document_to_duplicate.content or "" # Duplicate the document instance link_kwargs = ( diff --git a/src/frontend/apps/impress/src/components/Link.tsx b/src/frontend/apps/impress/src/components/Link.tsx index 0c90aef90f..2e9ef0039e 100644 --- a/src/frontend/apps/impress/src/components/Link.tsx +++ b/src/frontend/apps/impress/src/components/Link.tsx @@ -1,5 +1,8 @@ +import { Button } from '@gouvfr-lasuite/cunningham-react'; import Link from 'next/link'; -import styled, { RuleSet } from 'styled-components'; +import { useRouter } from 'next/router'; +import { type ComponentProps } from 'react'; +import styled, { type RuleSet } from 'styled-components'; export interface LinkProps { $css?: string | RuleSet; @@ -14,3 +17,35 @@ export const StyledLink = styled(Link)` display: flex; ${({ $css }) => $css && (typeof $css === 'string' ? `${$css};` : $css)} `; + +type ButtonLinkProps = ComponentProps & { + href: string; +}; + +export const ButtonLink = ({ + children, + onClick, + ref, + ...props +}: ButtonLinkProps) => { + const router = useRouter(); + + return ( + + ); +}; diff --git a/src/frontend/apps/impress/src/cunningham/cunningham-style.css b/src/frontend/apps/impress/src/cunningham/cunningham-style.css index b27a29fdae..0217a1bd2f 100644 --- a/src/frontend/apps/impress/src/cunningham/cunningham-style.css +++ b/src/frontend/apps/impress/src/cunningham/cunningham-style.css @@ -57,6 +57,18 @@ height: auto; } +/** +* Checkbox +*/ +.c__checkbox:focus-within { + border-color: transparent; + box-shadow: none; +} + +.c__checkbox .c__checkbox__wrapper:focus-within { + outline: none; +} + /** * Modal */ @@ -104,6 +116,10 @@ /** * Toast */ +.c__toast { + max-width: min(100%, 100vw); +} + .c__toast__container { z-index: -1; } @@ -111,3 +127,8 @@ .c__toast__container:has(.c__toast) { z-index: 10000; } + +.c__toast__content__children { + flex-shrink: 0; + flex-grow: 0; +} diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx index b504c9fc9f..050cbd98df 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx @@ -273,7 +273,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => { > {t('Export')} - + onClose()} diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx index 23a06c1075..fd43c1549a 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx @@ -188,6 +188,11 @@ const DocTitleInput = ({ doc }: DocTitleProps) => { $align="center" $gap="4px" $minHeight="40px" + $css={css` + &:focus-within { + outline: none; + } + `} > {!isTopRoot && } {/** diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index 8ad47dda48..9968047317 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -22,7 +22,7 @@ import LeaveSVG from '@/assets/icons/ui-kit/leave.svg'; import MarkdownCopySVG from '@/assets/icons/ui-kit/markdown_copy.svg'; import MoreSVG from '@/assets/icons/ui-kit/more_horiz.svg'; import { - Doc, + type Doc, KEY_DOC, KEY_LIST_DOC, KEY_LIST_FAVORITE_DOC, @@ -32,6 +32,7 @@ import { useDocUtils, useDuplicateDoc, } from '@/docs/doc-management'; +import { ConfirmationDuplicateModal } from '@/docs/doc-management/components/ConfirmationDuplicateModal'; import { usePresenterStore } from '@/docs/doc-presenter/stores'; import { useAuth } from '@/features/auth'; import { useFocusStore, useResponsiveStore } from '@/stores'; @@ -89,13 +90,14 @@ interface DocToolBoxProps { export const DocToolBox = ({ doc }: DocToolBoxProps) => { const { t } = useTranslation(); - const treeContext = useTreeContext(); + const treeContext = useTreeContext(); const router = useRouter(); const { isTopRoot } = useDocUtils(doc); const isTopParent = doc.id === treeContext?.root?.id; // it can be a child but not for the current user const { authenticated } = useAuth(); const copyCurrentEditorToClipboard = useCopyCurrentEditorToClipboard(); const [openDropdown, setOpenDropdown] = useState(false); + const [isModalDuplicateOpen, setIsModalDuplicateOpen] = useState(false); const [isModalRemoveOpen, setIsModalRemoveOpen] = useState(false); const [isModalExportOpen, setIsModalExportOpen] = useState(false); const [isModalShareOpen, setIsModalShareOpen] = useState(false); @@ -192,11 +194,14 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { icon: