mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-11 03:26:58 +02:00
Folder chevron icon
This commit is contained in:
@@ -7,6 +7,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate objc;
|
extern crate objc;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::env::current_dir;
|
||||||
|
use std::fs::{create_dir_all, File};
|
||||||
|
use std::io::Write;
|
||||||
|
use std::process::exit;
|
||||||
|
|
||||||
use base64::Engine;
|
use base64::Engine;
|
||||||
use http::header::{HeaderName, ACCEPT, USER_AGENT};
|
use http::header::{HeaderName, ACCEPT, USER_AGENT};
|
||||||
use http::{HeaderMap, HeaderValue, Method};
|
use http::{HeaderMap, HeaderValue, Method};
|
||||||
@@ -17,17 +23,13 @@ use sqlx::migrate::Migrator;
|
|||||||
use sqlx::sqlite::SqlitePoolOptions;
|
use sqlx::sqlite::SqlitePoolOptions;
|
||||||
use sqlx::types::Json;
|
use sqlx::types::Json;
|
||||||
use sqlx::{Pool, Sqlite};
|
use sqlx::{Pool, Sqlite};
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::env::current_dir;
|
|
||||||
use std::fs::{create_dir_all, File};
|
|
||||||
use std::io::Write;
|
|
||||||
use std::process::exit;
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use tauri::TitleBarStyle;
|
use tauri::TitleBarStyle;
|
||||||
use tauri::{AppHandle, Menu, RunEvent, State, Submenu, Window, WindowUrl, Wry};
|
use tauri::{AppHandle, Menu, RunEvent, State, Submenu, Window, WindowUrl, Wry};
|
||||||
use tauri::{CustomMenuItem, Manager, WindowEvent};
|
use tauri::{CustomMenuItem, Manager, WindowEvent};
|
||||||
use tauri_plugin_window_state::{StateFlags, WindowExt};
|
use tauri_plugin_window_state::{StateFlags, WindowExt};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use window_ext::TrafficLightWindowExt;
|
use window_ext::TrafficLightWindowExt;
|
||||||
|
|
||||||
mod menu;
|
mod menu;
|
||||||
@@ -881,7 +883,7 @@ fn create_window(handle: &AppHandle<Wry>, url: Option<&str>) -> Window<Wry> {
|
|||||||
let win2 = win.clone();
|
let win2 = win.clone();
|
||||||
let handle2 = handle.clone();
|
let handle2 = handle.clone();
|
||||||
win.on_menu_event(move |event| match event.menu_item_id() {
|
win.on_menu_event(move |event| match event.menu_item_id() {
|
||||||
"quit" => std::process::exit(0),
|
"quit" => exit(0),
|
||||||
"close" => win2.close().unwrap(),
|
"close" => win2.close().unwrap(),
|
||||||
"zoom_reset" => win2.emit("zoom", 0).unwrap(),
|
"zoom_reset" => win2.emit("zoom", 0).unwrap(),
|
||||||
"zoom_in" => win2.emit("zoom", 1).unwrap(),
|
"zoom_in" => win2.emit("zoom", 1).unwrap(),
|
||||||
|
|||||||
@@ -4,26 +4,26 @@ import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useSta
|
|||||||
import type { XYCoord } from 'react-dnd';
|
import type { XYCoord } from 'react-dnd';
|
||||||
import { useDrag, useDrop } from 'react-dnd';
|
import { useDrag, useDrop } from 'react-dnd';
|
||||||
import { useKey, useKeyPressEvent } from 'react-use';
|
import { useKey, useKeyPressEvent } from 'react-use';
|
||||||
|
import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId';
|
||||||
import { useActiveRequestId } from '../hooks/useActiveRequestId';
|
import { useActiveRequestId } from '../hooks/useActiveRequestId';
|
||||||
|
import { useActiveWorkspace } from '../hooks/useActiveWorkspace';
|
||||||
import { useAppRoutes } from '../hooks/useAppRoutes';
|
import { useAppRoutes } from '../hooks/useAppRoutes';
|
||||||
|
import { useCreateRequest } from '../hooks/useCreateRequest';
|
||||||
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
|
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
|
||||||
|
import { useFolders } from '../hooks/useFolders';
|
||||||
import { useLatestResponse } from '../hooks/useLatestResponse';
|
import { useLatestResponse } from '../hooks/useLatestResponse';
|
||||||
|
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
||||||
import { useRequests } from '../hooks/useRequests';
|
import { useRequests } from '../hooks/useRequests';
|
||||||
import { useSidebarHidden } from '../hooks/useSidebarHidden';
|
import { useSidebarHidden } from '../hooks/useSidebarHidden';
|
||||||
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder';
|
||||||
import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest';
|
import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest';
|
||||||
import { useUpdateRequest } from '../hooks/useUpdateRequest';
|
import { useUpdateRequest } from '../hooks/useUpdateRequest';
|
||||||
import type { Folder, HttpRequest, Workspace } from '../lib/models';
|
import type { Folder, HttpRequest, Workspace } from '../lib/models';
|
||||||
import { isResponseLoading } from '../lib/models';
|
import { isResponseLoading } from '../lib/models';
|
||||||
import { Icon } from './core/Icon';
|
import { Icon } from './core/Icon';
|
||||||
|
import { VStack } from './core/Stacks';
|
||||||
import { StatusTag } from './core/StatusTag';
|
import { StatusTag } from './core/StatusTag';
|
||||||
import { DropMarker } from './DropMarker';
|
import { DropMarker } from './DropMarker';
|
||||||
import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId';
|
|
||||||
import { useCreateRequest } from '../hooks/useCreateRequest';
|
|
||||||
import { VStack } from './core/Stacks';
|
|
||||||
import { useFolders } from '../hooks/useFolders';
|
|
||||||
import { useActiveWorkspace } from '../hooks/useActiveWorkspace';
|
|
||||||
import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder';
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
className?: string;
|
className?: string;
|
||||||
@@ -402,6 +402,7 @@ function SidebarItems({
|
|||||||
onSelect={onSelect}
|
onSelect={onSelect}
|
||||||
onDragStart={handleDragStart}
|
onDragStart={handleDragStart}
|
||||||
useProminentStyles={focused}
|
useProminentStyles={focused}
|
||||||
|
collapsed={collapsed}
|
||||||
className={classNames(tree.depth > 0 && 'border-l border-highlight ml-5')}
|
className={classNames(tree.depth > 0 && 'border-l border-highlight ml-5')}
|
||||||
>
|
>
|
||||||
{child.item.model === 'folder' &&
|
{child.item.model === 'folder' &&
|
||||||
@@ -443,17 +444,20 @@ type SidebarItemProps = {
|
|||||||
onSelect: (id: string) => void;
|
onSelect: (id: string) => void;
|
||||||
draggable?: boolean;
|
draggable?: boolean;
|
||||||
children?: ReactNode;
|
children?: ReactNode;
|
||||||
|
collapsed: Record<string, boolean>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const _SidebarItem = forwardRef(function SidebarItem(
|
const SidebarItem = forwardRef(function SidebarItem(
|
||||||
{
|
{
|
||||||
children,
|
children,
|
||||||
className,
|
className,
|
||||||
itemName,
|
itemName,
|
||||||
itemId,
|
itemId,
|
||||||
|
itemModel,
|
||||||
useProminentStyles,
|
useProminentStyles,
|
||||||
selected,
|
selected,
|
||||||
onSelect,
|
onSelect,
|
||||||
|
collapsed,
|
||||||
}: SidebarItemProps,
|
}: SidebarItemProps,
|
||||||
ref: ForwardedRef<HTMLLIElement>,
|
ref: ForwardedRef<HTMLLIElement>,
|
||||||
) {
|
) {
|
||||||
@@ -493,7 +497,10 @@ const _SidebarItem = forwardRef(function SidebarItem(
|
|||||||
[handleSubmitNameEdit],
|
[handleSubmitNameEdit],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleStartEditing = useCallback(() => setEditing(true), [setEditing]);
|
const handleStartEditing = useCallback(() => {
|
||||||
|
if (itemModel !== 'http_request') return;
|
||||||
|
setEditing(true);
|
||||||
|
}, [setEditing, itemModel]);
|
||||||
|
|
||||||
const handleBlur = useCallback(
|
const handleBlur = useCallback(
|
||||||
(e: React.FocusEvent<HTMLInputElement>) => {
|
(e: React.FocusEvent<HTMLInputElement>) => {
|
||||||
@@ -525,6 +532,13 @@ const _SidebarItem = forwardRef(function SidebarItem(
|
|||||||
selected && useProminentStyles && '!bg-violet-500/20 text-gray-900',
|
selected && useProminentStyles && '!bg-violet-500/20 text-gray-900',
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
{itemModel === 'folder' && (
|
||||||
|
<Icon
|
||||||
|
size="sm"
|
||||||
|
icon={collapsed[itemId] ? 'chevronRight' : 'chevronDown'}
|
||||||
|
className="-ml-0.5 mr-2"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{editing ? (
|
{editing ? (
|
||||||
<input
|
<input
|
||||||
ref={handleFocus}
|
ref={handleFocus}
|
||||||
@@ -554,8 +568,6 @@ const _SidebarItem = forwardRef(function SidebarItem(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const SidebarItem = memo(_SidebarItem);
|
|
||||||
|
|
||||||
type DraggableSidebarItemProps = SidebarItemProps & {
|
type DraggableSidebarItemProps = SidebarItemProps & {
|
||||||
onMove: (id: string, side: 'above' | 'below') => void;
|
onMove: (id: string, side: 'above' | 'below') => void;
|
||||||
onEnd: (id: string) => void;
|
onEnd: (id: string) => void;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
CheckboxIcon,
|
CheckboxIcon,
|
||||||
CheckIcon,
|
CheckIcon,
|
||||||
ChevronDownIcon,
|
ChevronDownIcon,
|
||||||
|
ChevronRightIcon,
|
||||||
ClockIcon,
|
ClockIcon,
|
||||||
CodeIcon,
|
CodeIcon,
|
||||||
ColorWheelIcon,
|
ColorWheelIcon,
|
||||||
@@ -12,6 +13,7 @@ import {
|
|||||||
DividerHorizontalIcon,
|
DividerHorizontalIcon,
|
||||||
DotsHorizontalIcon,
|
DotsHorizontalIcon,
|
||||||
DotsVerticalIcon,
|
DotsVerticalIcon,
|
||||||
|
DownloadIcon,
|
||||||
DragHandleDots2Icon,
|
DragHandleDots2Icon,
|
||||||
EyeClosedIcon,
|
EyeClosedIcon,
|
||||||
EyeOpenIcon,
|
EyeOpenIcon,
|
||||||
@@ -34,7 +36,6 @@ import {
|
|||||||
TriangleDownIcon,
|
TriangleDownIcon,
|
||||||
TriangleLeftIcon,
|
TriangleLeftIcon,
|
||||||
TriangleRightIcon,
|
TriangleRightIcon,
|
||||||
DownloadIcon,
|
|
||||||
UpdateIcon,
|
UpdateIcon,
|
||||||
} from '@radix-ui/react-icons';
|
} from '@radix-ui/react-icons';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
@@ -50,6 +51,7 @@ const icons = {
|
|||||||
checkbox: CheckboxIcon,
|
checkbox: CheckboxIcon,
|
||||||
clock: ClockIcon,
|
clock: ClockIcon,
|
||||||
chevronDown: ChevronDownIcon,
|
chevronDown: ChevronDownIcon,
|
||||||
|
chevronRight: ChevronRightIcon,
|
||||||
code: CodeIcon,
|
code: CodeIcon,
|
||||||
colorWheel: ColorWheelIcon,
|
colorWheel: ColorWheelIcon,
|
||||||
copy: CopyIcon,
|
copy: CopyIcon,
|
||||||
|
|||||||
Reference in New Issue
Block a user