diff --git a/packages/bruno-app/src/components/CollectionSettings/Overview/index.js b/packages/bruno-app/src/components/CollectionSettings/Overview/index.js index 806ac2a53..4c7fe59df 100644 --- a/packages/bruno-app/src/components/CollectionSettings/Overview/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/Overview/index.js @@ -8,10 +8,12 @@ const Overview = ({ collection }) => { return (
-
-
- - {collection?.name} +
+
+ + + {collection?.name} +
diff --git a/packages/bruno-app/src/components/Dropdown/StyledWrapper.js b/packages/bruno-app/src/components/Dropdown/StyledWrapper.js index 33d379db8..c5f8e7ed8 100644 --- a/packages/bruno-app/src/components/Dropdown/StyledWrapper.js +++ b/packages/bruno-app/src/components/Dropdown/StyledWrapper.js @@ -179,6 +179,17 @@ const Wrapper = styled.div` } } + .breadcrumb-collapsed-dropdown { + max-width: 250px; + } + + .breadcrumb-collapsed-item { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dropdown-separator { height: 1px; background-color: ${(props) => props.theme.dropdown.separator}; diff --git a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js index 32e6dab92..203c88399 100644 --- a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js +++ b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js @@ -38,6 +38,12 @@ const QueryUrl = ({ item, collection, handleRun }) => { const [generateCodeItemModalOpen, setGenerateCodeItemModalOpen] = useState(false); const hasChanges = useMemo(() => hasRequestChanges(item), [item]); + useEffect(() => { + if (item.isTransient && !url && editorRef.current?.editor) { + setTimeout(() => editorRef.current?.editor?.focus(), 0); + } + }, [item.uid]); + const onSave = () => { dispatch(saveRequest(item.uid, collection.uid)); }; diff --git a/packages/bruno-app/src/components/RequestTabs/CollectionHeader/StyledWrapper.js b/packages/bruno-app/src/components/RequestTabs/CollectionHeader/StyledWrapper.js index 8210459b6..5ae18d474 100644 --- a/packages/bruno-app/src/components/RequestTabs/CollectionHeader/StyledWrapper.js +++ b/packages/bruno-app/src/components/RequestTabs/CollectionHeader/StyledWrapper.js @@ -25,7 +25,7 @@ const StyledWrapper = styled.div` } .switcher-name { - max-width: 300px; + max-width: 124px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -151,6 +151,14 @@ const StyledWrapper = styled.div` color: ${(props) => props.theme.colors.text.danger}; margin-left: 8px; } + .display-icon{ + padding: 4px; + box-sizing: content-box; + &:hover { + background: ${(props) => props.theme.sidebar.collection.item.hoverBg}; + border-radius: ${(props) => props.theme.border.radius.sm} + } + } `; export default StyledWrapper; diff --git a/packages/bruno-app/src/components/RequestTabs/CollectionHeader/index.js b/packages/bruno-app/src/components/RequestTabs/CollectionHeader/index.js index 7c832aeca..1398862a9 100644 --- a/packages/bruno-app/src/components/RequestTabs/CollectionHeader/index.js +++ b/packages/bruno-app/src/components/RequestTabs/CollectionHeader/index.js @@ -393,6 +393,16 @@ const CollectionHeader = ({ collection, isScratchCollection }) => { && currentWorkspace.type !== 'default' && !isRenamingWorkspace; + const handleDisplayIconClick = (e) => { + const uid = isScratchCollection ? `${collection.uid}-overview` : collection.uid; + const type = isScratchCollection ? 'workspaceOverview' : 'collection-settings'; + dispatch(addTab({ + uid: uid, + collectionUid: collection.uid, + type: type + })); + }; + return ( {closeWorkspaceModalOpen && currentWorkspace?.uid && ( @@ -411,7 +421,7 @@ const CollectionHeader = ({ collection, isScratchCollection }) => {
{isRenamingWorkspace ? (
- +
{ )}
) : ( - document.body} - icon={( - - )} - > - {/* Workspace section */} - {currentWorkspace && ( - <> -
Workspace
-
handleSwitchToWorkspace(currentWorkspace.uid)} - > -
- -
- - {currentWorkspace.name || 'Untitled Workspace'} - - {workspaceTabCount > 0 && ( - {workspaceTabCount} - )} -
- - )} - - {/* Collections section */} - {mountedCollections.length > 0 && ( - <> -
-
Collections
- {mountedCollections.map((col) => { - const colTabCount = getTabCount(col.uid); - return ( +
+ + document.body} + icon={( + + )} + > +
+ {currentWorkspace && ( + <> +
Workspace
handleSwitchToCollection(col)} + onClick={() => handleSwitchToWorkspace(currentWorkspace.uid)} >
- +
- {col.name || 'Untitled Collection'} - {colTabCount > 0 && ( - {colTabCount} + + {currentWorkspace.name || 'Untitled Workspace'} + + {workspaceTabCount > 0 && ( + {workspaceTabCount} )}
- ); - })} - - )} - + + )} + + {mountedCollections.length > 0 && ( + <> +
+
Collections
+ {mountedCollections.map((col) => { + const colTabCount = getTabCount(col.uid); + return ( +
handleSwitchToCollection(col)} + > +
+ +
+ {col.name || 'Untitled Collection'} + {colTabCount > 0 && ( + {colTabCount} + )} +
+ ); + })} + + )} +
+ +
)} {/* Workspace actions dropdown */} diff --git a/packages/bruno-app/src/components/SaveTransientRequest/CollectionListItem/index.js b/packages/bruno-app/src/components/SaveTransientRequest/CollectionListItem/index.js index 8d33eec43..7768700f7 100644 --- a/packages/bruno-app/src/components/SaveTransientRequest/CollectionListItem/index.js +++ b/packages/bruno-app/src/components/SaveTransientRequest/CollectionListItem/index.js @@ -1,6 +1,6 @@ import React, { useMemo, useCallback, memo } from 'react'; import { useSelector } from 'react-redux'; -import { IconDatabase, IconLoader2 } from '@tabler/icons'; +import { IconBox, IconLoader2 } from '@tabler/icons'; import { areItemsLoading } from 'utils/collections'; const CollectionListItem = memo(({ collectionUid, collectionPath, collectionName, isSelected, onSelect }) => { @@ -26,7 +26,7 @@ const CollectionListItem = memo(({ collectionUid, collectionPath, collectionName onClick={handleClick} >
- + {collectionName}
{isLoading && ( diff --git a/packages/bruno-app/src/components/SaveTransientRequest/FolderBreadcrumbs/index.js b/packages/bruno-app/src/components/SaveTransientRequest/FolderBreadcrumbs/index.js index f11b48bee..faee03385 100644 --- a/packages/bruno-app/src/components/SaveTransientRequest/FolderBreadcrumbs/index.js +++ b/packages/bruno-app/src/components/SaveTransientRequest/FolderBreadcrumbs/index.js @@ -1,5 +1,6 @@ import React from 'react'; -import { IconChevronRight } from '@tabler/icons'; +import { IconChevronRight, IconDots } from '@tabler/icons'; +import Dropdown from 'components/Dropdown'; const FolderBreadcrumbs = ({ collectionName, @@ -8,30 +9,64 @@ const FolderBreadcrumbs = ({ onNavigateToRoot, onNavigateToBreadcrumb }) => { + const collapsed = breadcrumbs.length > 1 ? breadcrumbs.slice(0, -1) : []; + const last = breadcrumbs.length > 0 ? breadcrumbs[breadcrumbs.length - 1] : null; + return ( - <> +
{collectionName} - {breadcrumbs.map((breadcrumb, index) => ( - + + {collapsed.length > 0 && ( + <> + + + + + )} + > +
+ {collapsed.map((breadcrumb, i) => ( +
onNavigateToBreadcrumb(i)} + title={breadcrumb.name} + > + {breadcrumb.name} +
+ ))} +
+
+ + )} + + {last && ( + <> { e.stopPropagation(); - onNavigateToBreadcrumb(index); + onNavigateToBreadcrumb(breadcrumbs.length - 1); }} + title={last.name} > - {breadcrumb.name} + {last.name} -
- ))} + + )} + {isAtRoot && } - +
); }; diff --git a/packages/bruno-app/src/components/SaveTransientRequest/StyledWrapper.js b/packages/bruno-app/src/components/SaveTransientRequest/StyledWrapper.js index 6a6fcf49e..3559f1b7a 100644 --- a/packages/bruno-app/src/components/SaveTransientRequest/StyledWrapper.js +++ b/packages/bruno-app/src/components/SaveTransientRequest/StyledWrapper.js @@ -1,6 +1,10 @@ import styled from 'styled-components'; const StyledWrapper = styled.div` + .bruno-modal-card.modal-sm { + width: 500px; + } + .save-request-form { display: flex; flex-direction: column; @@ -54,6 +58,7 @@ const StyledWrapper = styled.div` font-size: 14px; margin-bottom: 12px; color: ${(props) => props.theme.colors.text.muted}; + min-width: 0; } .collection-name-clickable { @@ -66,6 +71,49 @@ const StyledWrapper = styled.div` .collection-name-chevron { margin: 0 4px; + flex-shrink: 0; + } + + .breadcrumb-container { + display: flex; + align-items: center; + overflow: hidden; + white-space: nowrap; + min-width: 0; + } + + .breadcrumb-collection-name, + .breadcrumb-last { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 40px; + flex: 0 1 auto; + } + + .breadcrumb-ellipsis-btn { + display: flex; + align-items: center; + cursor: pointer; + padding: 2px 4px; + border-radius: ${(props) => props.theme.border.radius.sm}; + flex-shrink: 0; + color: ${(props) => props.theme.colors.text.yellow}; + + &:hover { + background-color: ${(props) => props.theme.plainGrid.hoverBg}; + } + } + + .breadcrumb-dropdown { + min-width: 120px; + max-width: 250px; + + .dropdown-item { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } } .search-container { @@ -114,10 +162,19 @@ const StyledWrapper = styled.div` display: flex; align-items: center; gap: 8px; + min-width: 0; + overflow: hidden; + + svg { + flex-shrink: 0; + } } .folder-item-name { color: ${(props) => props.theme.text}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .folder-empty-state { @@ -157,6 +214,7 @@ const StyledWrapper = styled.div` border-radius: ${(props) => props.theme.border.radius.sm}; user-select: none; border: 1px solid ${(props) => props.theme.border.border1}; + overflow: hidden; &:hover { background-color: ${(props) => props.theme.plainGrid.hoverBg}; @@ -168,11 +226,20 @@ const StyledWrapper = styled.div` display: flex; align-items: center; gap: 10px; + min-width: 0; + overflow: hidden; + + svg { + flex-shrink: 0; + } } .collection-item-name { color: ${(props) => props.theme.text}; font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .collection-empty-state { diff --git a/packages/bruno-app/src/components/SaveTransientRequest/index.js b/packages/bruno-app/src/components/SaveTransientRequest/index.js index 5708bf886..cc7b14e08 100644 --- a/packages/bruno-app/src/components/SaveTransientRequest/index.js +++ b/packages/bruno-app/src/components/SaveTransientRequest/index.js @@ -361,7 +361,7 @@ const SaveTransientRequest = ({ item: itemProp, collection: collectionProp, isOp return (