mirror of https://github.com/usememos/memos
feat: add view resource dialog
parent
8c8bb9e59f
commit
84564891be
@ -0,0 +1,40 @@
|
|||||||
|
import { ReactNode, useEffect, useRef } from "react";
|
||||||
|
import useToggle from "../../hooks/useToggle";
|
||||||
|
import Icon from "../Icon";
|
||||||
|
import "../../less/common/dropdown.less";
|
||||||
|
|
||||||
|
interface DropdownProps {
|
||||||
|
children?: ReactNode;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Dropdown: React.FC<DropdownProps> = (props: DropdownProps) => {
|
||||||
|
const { children, className } = props;
|
||||||
|
const [dropdownStatus, toggleDropdownStatus] = useToggle(false);
|
||||||
|
const dropdownWrapperRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (dropdownStatus) {
|
||||||
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
if (!dropdownWrapperRef.current?.contains(event.target as Node)) {
|
||||||
|
toggleDropdownStatus(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener("click", handleClickOutside, {
|
||||||
|
capture: true,
|
||||||
|
once: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [dropdownStatus]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div ref={dropdownWrapperRef} className={`dropdown-wrapper ${className ?? ""}`} onClick={() => toggleDropdownStatus()}>
|
||||||
|
<span className="trigger-button">
|
||||||
|
<Icon.MoreHorizontal className="icon-img" />
|
||||||
|
</span>
|
||||||
|
<div className={`action-buttons-container ${dropdownStatus ? "" : "!hidden"}`}>{children}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Dropdown;
|
@ -0,0 +1,21 @@
|
|||||||
|
@import "../mixin.less";
|
||||||
|
|
||||||
|
.dropdown-wrapper {
|
||||||
|
@apply relative flex flex-col justify-start items-start select-none;
|
||||||
|
|
||||||
|
> .trigger-button {
|
||||||
|
@apply flex flex-row justify-center items-center border p-1 rounded shadow text-gray-600 cursor-pointer hover:opacity-80;
|
||||||
|
|
||||||
|
> .icon-img {
|
||||||
|
@apply w-4 h-auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .action-buttons-container {
|
||||||
|
@apply w-28 mt-1 absolute top-full right-0 flex flex-col justify-start items-start bg-white z-1 border p-1 rounded shadow;
|
||||||
|
|
||||||
|
> button {
|
||||||
|
@apply w-full text-left px-2 text-sm leading-7 rounded hover:bg-gray-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
@import "./mixin.less";
|
||||||
|
|
||||||
|
.resources-dialog {
|
||||||
|
@apply px-4;
|
||||||
|
|
||||||
|
> .dialog-container {
|
||||||
|
@apply w-128 max-w-full mb-8;
|
||||||
|
|
||||||
|
> .dialog-content-container {
|
||||||
|
@apply flex flex-col justify-start items-start w-full;
|
||||||
|
|
||||||
|
> .tip-text-container {
|
||||||
|
@apply w-full flex flex-row justify-start items-start border border-yellow-600 rounded px-2 py-1 mb-2 text-yellow-600 bg-yellow-50 text-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .loading-text-container {
|
||||||
|
@apply flex flex-col justify-center items-center w-full h-32;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .resource-table-container {
|
||||||
|
@apply flex flex-col justify-start items-start w-full;
|
||||||
|
|
||||||
|
> .fields-container {
|
||||||
|
@apply px-2 py-2 w-full grid grid-cols-5 border-b;
|
||||||
|
|
||||||
|
> .field-text {
|
||||||
|
@apply font-mono text-gray-400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .resource-container {
|
||||||
|
@apply px-2 py-2 w-full grid grid-cols-5;
|
||||||
|
|
||||||
|
> .buttons-container {
|
||||||
|
@apply w-full flex flex-row justify-end items-center;
|
||||||
|
|
||||||
|
> .actions-dropdown {
|
||||||
|
.delete-btn {
|
||||||
|
@apply text-red-600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-text {
|
||||||
|
@apply w-full truncate text-base pr-2 last:pr-0;
|
||||||
|
|
||||||
|
&.name-text {
|
||||||
|
@apply col-span-2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue