UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: настройки проекта, модалки и drag-and-drop канон

This commit is contained in:
DCCONSTRUCTIONS
2026-04-20 09:22:37 +03:00
parent bd7a7d96fe
commit df68c96795
47 changed files with 703 additions and 275 deletions
@@ -916,8 +916,11 @@ export default {
priority: "{entity} Priority",
all: "All {entity}",
drop_here_to_move: "Drop here to move the {entity}",
drop_here_to_delete: "Drop here to delete the {entity}",
delete: {
label: "Delete {entity}",
confirmation:
"Are you sure you want to delete {entity} {identifier}? All related data will be permanently removed and this action cannot be undone.",
success: "{entity} deleted successfully",
failed: "{entity} delete failed",
},
@@ -1865,7 +1868,9 @@ export default {
members: {
label: "Members",
project_lead: "Project lead",
project_lead_description: "Choose the project lead.",
default_assignee: "Default assignee",
default_assignee_description: "Choose the default assignee for the project.",
guest_super_permissions: {
title: "Grant view access to all work items for guest users:",
sub_heading: "This will allow guests to have view access to all the project work items.",
@@ -1908,6 +1913,9 @@ export default {
label: "Estimates",
title: "Enable estimates for my project",
enable_description: "They help you in communicating complexity and workload of the team.",
list_heading: "Estimate list",
archived_heading: "Archived estimates",
archived_description: "These are estimates from earlier project versions that are not currently in use. Read more",
no_estimate: "No estimate",
new: "New estimate system",
create: {
@@ -1072,8 +1072,11 @@ export default {
priority: "Приоритет {entity}",
all: "Все {entity}",
drop_here_to_move: "Переместите {entity} сюда",
drop_here_to_delete: "Перетащите сюда, чтобы удалить {entity}",
delete: {
label: "Удалить {entity}",
confirmation:
"Вы уверены, что хотите удалить {entity} {identifier}? Все связанные данные будут удалены без возможности восстановления.",
success: "{entity} успешно удалён",
failed: "Ошибка удаления {entity}",
},
@@ -2024,7 +2027,9 @@ export default {
members: {
label: "Участники",
project_lead: "Руководитель проекта",
project_lead_description: "Выберите руководителя проекта.",
default_assignee: "Ответственный по умолчанию",
default_assignee_description: "Выберите ответственного по умолчанию для проекта.",
guest_super_permissions: {
title: "Дать гостям доступ на просмотр всех рабочих элементов:",
sub_heading: "Гости смогут просматривать все рабочие элементы проекта",
@@ -2067,6 +2072,9 @@ export default {
label: "Оценки",
title: "Включить оценки для моего проекта",
enable_description: "Они помогают вам в общении о сложности и рабочей нагрузке команды.",
list_heading: "Список оценок",
archived_heading: "Архивные оценки",
archived_description: "Это оценки из предыдущих версий проекта, которые сейчас не используются. Подробнее о них",
no_estimate: "Без оценки",
new: "Новая система оценок",
create: {
@@ -202,10 +202,10 @@ function CustomMenu(props: ICustomMenuDropdownProps) {
className={cn(
"nodedc-glass-modal nodedc-glass-popup-surface my-1 min-w-[13rem] overflow-y-auto rounded-[1.25rem] border-0 px-2 py-2.5 text-12 whitespace-nowrap shadow-none outline-none",
{
"max-h-60": maxHeight === "lg",
"max-h-48": maxHeight === "md",
"max-h-36": maxHeight === "rg",
"max-h-28": maxHeight === "sm",
"max-h-[min(85vh,40rem)]": maxHeight === "lg",
"max-h-[min(70vh,24rem)]": maxHeight === "md",
"max-h-[min(55vh,18rem)]": maxHeight === "rg",
"max-h-[min(40vh,12rem)]": maxHeight === "sm",
},
optionsClassName
)}
@@ -122,7 +122,7 @@ function CustomSelect(props: ICustomSelectProps) {
<Combobox.Options data-prevent-outside-click>
<div
className={cn(
"z-30 my-1 min-w-48 overflow-y-scroll rounded-md border-[0.5px] border-subtle-1 bg-surface-1 px-2 py-2.5 text-11 whitespace-nowrap focus:outline-none",
"nodedc-dropdown-surface z-30 my-1 min-w-48 overflow-y-scroll whitespace-nowrap focus:outline-none",
optionsClassName
)}
ref={setPopperElement}
@@ -166,9 +166,9 @@ function Option(props: ICustomSelectItemProps) {
value={value}
className={({ active }) =>
cn(
"flex cursor-pointer items-center justify-between gap-2 truncate rounded-sm px-1 py-1.5 text-secondary select-none",
"nodedc-dropdown-option cursor-pointer text-secondary",
{
"bg-layer-transparent-hover": active,
"bg-white/6": active,
},
className
)
@@ -75,8 +75,14 @@ export function AlertModalCore(props: Props) {
const Icon = VARIANT_ICONS[variant];
return (
<ModalCore isOpen={isOpen} handleClose={handleClose} position={position} width={width}>
<div className="flex flex-col items-center gap-4 p-5 sm:flex-row sm:items-start">
<ModalCore
isOpen={isOpen}
handleClose={handleClose}
position={position}
width={width}
className="transition-[width] ease-linear"
>
<div className="flex flex-col items-center gap-4 px-6 pt-6 pb-5 sm:flex-row sm:items-start">
{!hideIcon && (
<span
className={cn(
@@ -88,15 +94,24 @@ export function AlertModalCore(props: Props) {
</span>
)}
<div className="text-center sm:text-left">
<h3 className="text-16 font-medium">{title}</h3>
<h3 className="text-18 font-medium text-secondary">{title}</h3>
<p className="mt-1 text-13 text-secondary">{content}</p>
</div>
</div>
<div className="flex flex-col-reverse gap-2 border-t-[0.5px] border-subtle px-5 py-4 sm:flex-row sm:justify-end">
<Button variant="secondary" onClick={handleClose}>
<div className="flex flex-col-reverse gap-3 border-t border-subtle/70 px-6 py-4 sm:flex-row sm:justify-end">
<Button variant="secondary" onClick={handleClose} className="nodedc-modal-secondary-button min-w-[8.25rem]">
{secondaryButtonText}
</Button>
<Button variant={BUTTON_VARIANTS[variant]} tabIndex={1} onClick={handleSubmit} loading={isSubmitting}>
<Button
variant={BUTTON_VARIANTS[variant]}
tabIndex={1}
onClick={handleSubmit}
loading={isSubmitting}
className={cn("min-w-[8.25rem]", {
"nodedc-modal-danger-button": variant === "danger",
"nodedc-modal-primary-button": variant === "primary",
})}
>
{isSubmitting ? primaryButtonText.loading : primaryButtonText.default}
</Button>
</div>