+
+
+
+ {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 (