From c72ea44e288e050c803158392896c0f5d40a8e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Tue, 10 Mar 2026 11:10:25 +0100 Subject: [PATCH] nicolium: drive improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../dropdown-menu/dropdown-menu-item.tsx | 6 +- packages/nicolium/src/pages/drive/drive.tsx | 65 +++++++++++++++++-- packages/nicolium/src/styles/new/drive.scss | 2 +- 3 files changed, 65 insertions(+), 8 deletions(-) diff --git a/packages/nicolium/src/components/dropdown-menu/dropdown-menu-item.tsx b/packages/nicolium/src/components/dropdown-menu/dropdown-menu-item.tsx index 2b672dae0..3d14352dc 100644 --- a/packages/nicolium/src/components/dropdown-menu/dropdown-menu-item.tsx +++ b/packages/nicolium/src/components/dropdown-menu/dropdown-menu-item.tsx @@ -88,9 +88,11 @@ const DropdownMenuItem = ({ index, item, onClick, autoFocus, onSetTab }: IDropdo } }; - const handleItemKeyPress: React.EventHandler = (event) => { + const handleItemKeyDown: React.KeyboardEventHandler = (event) => { if (event.key === 'Enter' || event.key === ' ') { handleClick(event); + event.preventDefault(); + event.stopPropagation(); } }; @@ -132,7 +134,7 @@ const DropdownMenuItem = ({ index, item, onClick, autoFocus, onSetTab }: IDropdo data-index={index} onClick={handleClick} onAuxClick={handleAuxClick} - onKeyPress={handleItemKeyPress} + onKeyDown={handleItemKeyDown} target={typeof item.target === 'string' ? item.target : '_blank'} title={item.text} className={clsx( diff --git a/packages/nicolium/src/pages/drive/drive.tsx b/packages/nicolium/src/pages/drive/drive.tsx index 40904dcec..5cc4d15ac 100644 --- a/packages/nicolium/src/pages/drive/drive.tsx +++ b/packages/nicolium/src/pages/drive/drive.tsx @@ -2,7 +2,7 @@ import defaultIcon from '@phosphor-icons/core/regular/paperclip.svg'; import { Link, useNavigate } from '@tanstack/react-router'; import { clsx } from 'clsx'; import { mediaAttachmentSchema, type DriveFile, type DriveFolder } from 'pl-api'; -import React, { useMemo } from 'react'; +import React, { useMemo, useRef } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import * as v from 'valibot'; @@ -126,6 +126,7 @@ const messages = defineMessages({ defaultMessage: 'Folder created successfully.', }, newFolderError: { id: 'drive.folder.new.error', defaultMessage: 'Failed to create folder.' }, + home: { id: 'drive.breadcrumbs.home', defaultMessage: 'Home' }, }); interface IBreadcrumbs { @@ -136,6 +137,7 @@ interface IBreadcrumbs { const Breadcrumbs: React.FC = ({ folderId, depth = 0, onClick }) => { const { data } = useDriveFolderQuery(folderId); + const intl = useIntl(); if (!folderId) { const label = depth === 0 && ( @@ -152,8 +154,10 @@ const Breadcrumbs: React.FC = ({ folderId, depth = 0, onClick }) = })} onClick={() => onClick?.()} disabled={depth === 0} + aria-label={intl.formatMessage(messages.home)} + title={intl.formatMessage(messages.home)} > - + {label} ); @@ -163,8 +167,10 @@ const Breadcrumbs: React.FC = ({ folderId, depth = 0, onClick }) = to='/drive/{-$folderId}' params={{ folderId: undefined }} className='⁂-drive-breadcrumbs__home' + aria-label={intl.formatMessage(messages.home)} + title={intl.formatMessage(messages.home)} > - + {label} ); @@ -231,6 +237,7 @@ interface IFile { const File: React.FC = ({ file }) => { const intl = useIntl(); + const fileRef = useRef(null); const { openModal } = useModalsActions(); const { mutate: updateFile } = useUpdateDriveFileMutation(file.id); @@ -266,6 +273,23 @@ const File: React.FC = ({ file }) => { }); }; + const handleFileKeyDown: React.KeyboardEventHandler = (e) => { + switch (e.key) { + case 'Enter': + case ' ': + handleView(); + e.preventDefault(); + e.stopPropagation(); + } + }; + + const handleContextMenu: React.MouseEventHandler = (e) => { + e.preventDefault(); + e.stopPropagation(); + + fileRef.current?.querySelector('button')?.click(); + }; + const items = useMemo(() => { const handleRename = () => { openModal('TEXT_FIELD', { @@ -442,7 +466,14 @@ const File: React.FC = ({ file }) => { }, [file]); return ( -
+
= ({ folder }) => { const navigate = useNavigate(); const intl = useIntl(); + const folderRef = useRef(null); const { openModal } = useModalsActions(); const { mutate: deleteFolder } = useDeleteDriveFolderMutation(folder.id!); @@ -484,6 +516,22 @@ const Folder: React.FC = ({ folder }) => { navigate({ to: '/drive/{-$folderId}', params: { folderId: folder.id ?? undefined } }); }; + const handleFolderKeyDown: React.KeyboardEventHandler = (e) => { + switch (e.key) { + case 'Enter': + handleEnterFolder(); + e.preventDefault(); + e.stopPropagation(); + } + }; + + const handleContextMenu: React.MouseEventHandler = (e) => { + e.preventDefault(); + e.stopPropagation(); + + folderRef.current?.querySelector('button')?.click(); + }; + const items: Menu = useMemo(() => { const handleRename = () => { openModal('TEXT_FIELD', { @@ -575,7 +623,14 @@ const Folder: React.FC = ({ folder }) => { }, [folder]); return ( -
+