diff --git a/apps/admin/app/(all)/(dashboard)/layout.tsx b/apps/admin/app/(all)/(dashboard)/layout.tsx index 694e71746c..8b771dc796 100644 --- a/apps/admin/app/(all)/(dashboard)/layout.tsx +++ b/apps/admin/app/(all)/(dashboard)/layout.tsx @@ -11,7 +11,7 @@ import { Outlet } from "react-router"; // components import { AdminHeader } from "@/components/common/header"; import { LogoSpinner } from "@/components/common/logo-spinner"; -import { NewUserPopup } from "@/components/new-user-popup"; +import { NewUserPopup } from "@/components/common/new-user-popup"; // hooks import { useUser } from "@/hooks/store"; // local components diff --git a/apps/admin/app/(all)/(home)/sign-in-form.tsx b/apps/admin/app/(all)/(home)/sign-in-form.tsx index 83cb45cb5e..14b96f8711 100644 --- a/apps/admin/app/(all)/(home)/sign-in-form.tsx +++ b/apps/admin/app/(all)/(home)/sign-in-form.tsx @@ -16,7 +16,7 @@ import { Input, Spinner } from "@plane/ui"; // components import { Banner } from "@/components/common/banner"; // local components -import { FormHeader } from "../../../core/components/instance/form-header"; +import { FormHeader } from "@/components/instance/form-header"; import { AuthBanner } from "./auth-banner"; import { AuthHeader } from "./auth-header"; import { authErrorHandler } from "./auth-helpers"; diff --git a/apps/admin/ce/store/root.store.ts b/apps/admin/ce/store/root.store.ts deleted file mode 100644 index 891cd99c43..0000000000 --- a/apps/admin/ce/store/root.store.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { enableStaticRendering } from "mobx-react"; -// stores -import { CoreRootStore } from "@/store/root.store"; - -enableStaticRendering(typeof window === "undefined"); - -export class RootStore extends CoreRootStore { - constructor() { - super(); - } - - hydrate(initialData: any) { - super.hydrate(initialData); - } - - resetOnSignOut() { - super.resetOnSignOut(); - } -} diff --git a/apps/admin/core/components/authentication/authentication-method-card.tsx b/apps/admin/components/authentication/authentication-method-card.tsx similarity index 100% rename from apps/admin/core/components/authentication/authentication-method-card.tsx rename to apps/admin/components/authentication/authentication-method-card.tsx diff --git a/apps/admin/core/components/authentication/email-config-switch.tsx b/apps/admin/components/authentication/email-config-switch.tsx similarity index 100% rename from apps/admin/core/components/authentication/email-config-switch.tsx rename to apps/admin/components/authentication/email-config-switch.tsx diff --git a/apps/admin/core/components/authentication/gitea-config.tsx b/apps/admin/components/authentication/gitea-config.tsx similarity index 100% rename from apps/admin/core/components/authentication/gitea-config.tsx rename to apps/admin/components/authentication/gitea-config.tsx diff --git a/apps/admin/core/components/authentication/github-config.tsx b/apps/admin/components/authentication/github-config.tsx similarity index 100% rename from apps/admin/core/components/authentication/github-config.tsx rename to apps/admin/components/authentication/github-config.tsx diff --git a/apps/admin/core/components/authentication/gitlab-config.tsx b/apps/admin/components/authentication/gitlab-config.tsx similarity index 100% rename from apps/admin/core/components/authentication/gitlab-config.tsx rename to apps/admin/components/authentication/gitlab-config.tsx diff --git a/apps/admin/core/components/authentication/google-config.tsx b/apps/admin/components/authentication/google-config.tsx similarity index 100% rename from apps/admin/core/components/authentication/google-config.tsx rename to apps/admin/components/authentication/google-config.tsx diff --git a/apps/admin/core/components/authentication/password-config-switch.tsx b/apps/admin/components/authentication/password-config-switch.tsx similarity index 100% rename from apps/admin/core/components/authentication/password-config-switch.tsx rename to apps/admin/components/authentication/password-config-switch.tsx diff --git a/apps/admin/core/components/common/banner.tsx b/apps/admin/components/common/banner.tsx similarity index 100% rename from apps/admin/core/components/common/banner.tsx rename to apps/admin/components/common/banner.tsx diff --git a/apps/admin/core/components/common/breadcrumb-link.tsx b/apps/admin/components/common/breadcrumb-link.tsx similarity index 100% rename from apps/admin/core/components/common/breadcrumb-link.tsx rename to apps/admin/components/common/breadcrumb-link.tsx diff --git a/apps/admin/core/components/common/code-block.tsx b/apps/admin/components/common/code-block.tsx similarity index 100% rename from apps/admin/core/components/common/code-block.tsx rename to apps/admin/components/common/code-block.tsx diff --git a/apps/admin/core/components/common/confirm-discard-modal.tsx b/apps/admin/components/common/confirm-discard-modal.tsx similarity index 100% rename from apps/admin/core/components/common/confirm-discard-modal.tsx rename to apps/admin/components/common/confirm-discard-modal.tsx diff --git a/apps/admin/core/components/common/controller-input.tsx b/apps/admin/components/common/controller-input.tsx similarity index 100% rename from apps/admin/core/components/common/controller-input.tsx rename to apps/admin/components/common/controller-input.tsx diff --git a/apps/admin/core/components/common/controller-switch.tsx b/apps/admin/components/common/controller-switch.tsx similarity index 100% rename from apps/admin/core/components/common/controller-switch.tsx rename to apps/admin/components/common/controller-switch.tsx diff --git a/apps/admin/core/components/common/copy-field.tsx b/apps/admin/components/common/copy-field.tsx similarity index 100% rename from apps/admin/core/components/common/copy-field.tsx rename to apps/admin/components/common/copy-field.tsx diff --git a/apps/admin/core/components/common/empty-state.tsx b/apps/admin/components/common/empty-state.tsx similarity index 100% rename from apps/admin/core/components/common/empty-state.tsx rename to apps/admin/components/common/empty-state.tsx diff --git a/apps/admin/core/components/common/header/core.ts b/apps/admin/components/common/header/core.ts similarity index 100% rename from apps/admin/core/components/common/header/core.ts rename to apps/admin/components/common/header/core.ts diff --git a/apps/admin/core/components/common/header/extended.ts b/apps/admin/components/common/header/extended.ts similarity index 100% rename from apps/admin/core/components/common/header/extended.ts rename to apps/admin/components/common/header/extended.ts diff --git a/apps/admin/core/components/common/header/index.tsx b/apps/admin/components/common/header/index.tsx similarity index 97% rename from apps/admin/core/components/common/header/index.tsx rename to apps/admin/components/common/header/index.tsx index e4e8031092..403e078c5e 100644 --- a/apps/admin/core/components/common/header/index.tsx +++ b/apps/admin/components/common/header/index.tsx @@ -10,7 +10,7 @@ import { Menu, Settings } from "lucide-react"; // icons import { Breadcrumbs } from "@plane/ui"; // components -import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; +import { BreadcrumbLink } from "../breadcrumb-link"; // hooks import { useTheme } from "@/hooks/store"; // local imports diff --git a/apps/admin/core/components/common/logo-spinner.tsx b/apps/admin/components/common/logo-spinner.tsx similarity index 100% rename from apps/admin/core/components/common/logo-spinner.tsx rename to apps/admin/components/common/logo-spinner.tsx diff --git a/apps/admin/core/components/new-user-popup.tsx b/apps/admin/components/common/new-user-popup.tsx similarity index 100% rename from apps/admin/core/components/new-user-popup.tsx rename to apps/admin/components/common/new-user-popup.tsx diff --git a/apps/admin/core/components/common/page-header.tsx b/apps/admin/components/common/page-header.tsx similarity index 100% rename from apps/admin/core/components/common/page-header.tsx rename to apps/admin/components/common/page-header.tsx diff --git a/apps/admin/core/components/common/page-wrapper.tsx b/apps/admin/components/common/page-wrapper.tsx similarity index 100% rename from apps/admin/core/components/common/page-wrapper.tsx rename to apps/admin/components/common/page-wrapper.tsx diff --git a/apps/admin/core/components/instance/failure.tsx b/apps/admin/components/instance/failure.tsx similarity index 100% rename from apps/admin/core/components/instance/failure.tsx rename to apps/admin/components/instance/failure.tsx diff --git a/apps/admin/core/components/instance/form-header.tsx b/apps/admin/components/instance/form-header.tsx similarity index 100% rename from apps/admin/core/components/instance/form-header.tsx rename to apps/admin/components/instance/form-header.tsx diff --git a/apps/admin/core/components/instance/instance-not-ready.tsx b/apps/admin/components/instance/instance-not-ready.tsx similarity index 100% rename from apps/admin/core/components/instance/instance-not-ready.tsx rename to apps/admin/components/instance/instance-not-ready.tsx diff --git a/apps/admin/core/components/instance/loading.tsx b/apps/admin/components/instance/loading.tsx similarity index 100% rename from apps/admin/core/components/instance/loading.tsx rename to apps/admin/components/instance/loading.tsx diff --git a/apps/admin/core/components/instance/setup-form.tsx b/apps/admin/components/instance/setup-form.tsx similarity index 99% rename from apps/admin/core/components/instance/setup-form.tsx rename to apps/admin/components/instance/setup-form.tsx index 10eb238cab..e500a55e17 100644 --- a/apps/admin/core/components/instance/setup-form.tsx +++ b/apps/admin/components/instance/setup-form.tsx @@ -16,8 +16,8 @@ import { Checkbox, Input, PasswordStrengthIndicator, Spinner } from "@plane/ui"; import { getPasswordStrength } from "@plane/utils"; // components import { AuthHeader } from "@/app/(all)/(home)/auth-header"; -import { Banner } from "@/components/common/banner"; -import { FormHeader } from "@/components/instance/form-header"; +import { Banner } from "../common/banner"; +import { FormHeader } from "./form-header"; // service initialization const authService = new AuthService(); diff --git a/apps/admin/core/components/workspace/list-item.tsx b/apps/admin/components/workspace/list-item.tsx similarity index 100% rename from apps/admin/core/components/workspace/list-item.tsx rename to apps/admin/components/workspace/list-item.tsx diff --git a/apps/admin/ee/store/root.store.ts b/apps/admin/ee/store/root.store.ts deleted file mode 100644 index 0f36aac3dd..0000000000 --- a/apps/admin/ee/store/root.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/root.store"; diff --git a/apps/admin/core/helpers/authentication.ts b/apps/admin/helpers/authentication.ts similarity index 100% rename from apps/admin/core/helpers/authentication.ts rename to apps/admin/helpers/authentication.ts diff --git a/apps/admin/core/hooks/oauth/core.tsx b/apps/admin/hooks/oauth/core.tsx similarity index 100% rename from apps/admin/core/hooks/oauth/core.tsx rename to apps/admin/hooks/oauth/core.tsx diff --git a/apps/admin/core/hooks/oauth/index.ts b/apps/admin/hooks/oauth/index.ts similarity index 100% rename from apps/admin/core/hooks/oauth/index.ts rename to apps/admin/hooks/oauth/index.ts diff --git a/apps/admin/core/hooks/oauth/types.ts b/apps/admin/hooks/oauth/types.ts similarity index 100% rename from apps/admin/core/hooks/oauth/types.ts rename to apps/admin/hooks/oauth/types.ts diff --git a/apps/admin/core/hooks/store/index.ts b/apps/admin/hooks/store/index.ts similarity index 100% rename from apps/admin/core/hooks/store/index.ts rename to apps/admin/hooks/store/index.ts diff --git a/apps/admin/core/hooks/store/use-instance.tsx b/apps/admin/hooks/store/use-instance.tsx similarity index 100% rename from apps/admin/core/hooks/store/use-instance.tsx rename to apps/admin/hooks/store/use-instance.tsx diff --git a/apps/admin/core/hooks/store/use-theme.tsx b/apps/admin/hooks/store/use-theme.tsx similarity index 100% rename from apps/admin/core/hooks/store/use-theme.tsx rename to apps/admin/hooks/store/use-theme.tsx diff --git a/apps/admin/core/hooks/store/use-user.tsx b/apps/admin/hooks/store/use-user.tsx similarity index 100% rename from apps/admin/core/hooks/store/use-user.tsx rename to apps/admin/hooks/store/use-user.tsx diff --git a/apps/admin/core/hooks/store/use-workspace.tsx b/apps/admin/hooks/store/use-workspace.tsx similarity index 100% rename from apps/admin/core/hooks/store/use-workspace.tsx rename to apps/admin/hooks/store/use-workspace.tsx diff --git a/apps/admin/core/hooks/use-sidebar-menu/core.ts b/apps/admin/hooks/use-sidebar-menu/core.ts similarity index 100% rename from apps/admin/core/hooks/use-sidebar-menu/core.ts rename to apps/admin/hooks/use-sidebar-menu/core.ts diff --git a/apps/admin/core/hooks/use-sidebar-menu/index.ts b/apps/admin/hooks/use-sidebar-menu/index.ts similarity index 100% rename from apps/admin/core/hooks/use-sidebar-menu/index.ts rename to apps/admin/hooks/use-sidebar-menu/index.ts diff --git a/apps/admin/core/hooks/use-sidebar-menu/types.ts b/apps/admin/hooks/use-sidebar-menu/types.ts similarity index 100% rename from apps/admin/core/hooks/use-sidebar-menu/types.ts rename to apps/admin/hooks/use-sidebar-menu/types.ts diff --git a/apps/admin/core/lib/b-progress/AppProgressBar.tsx b/apps/admin/lib/b-progress/AppProgressBar.tsx similarity index 100% rename from apps/admin/core/lib/b-progress/AppProgressBar.tsx rename to apps/admin/lib/b-progress/AppProgressBar.tsx diff --git a/apps/admin/core/lib/b-progress/index.tsx b/apps/admin/lib/b-progress/index.tsx similarity index 100% rename from apps/admin/core/lib/b-progress/index.tsx rename to apps/admin/lib/b-progress/index.tsx diff --git a/apps/admin/core/providers/core.tsx b/apps/admin/providers/core.tsx similarity index 100% rename from apps/admin/core/providers/core.tsx rename to apps/admin/providers/core.tsx diff --git a/apps/admin/core/providers/extended.tsx b/apps/admin/providers/extended.tsx similarity index 100% rename from apps/admin/core/providers/extended.tsx rename to apps/admin/providers/extended.tsx diff --git a/apps/admin/core/providers/index.tsx b/apps/admin/providers/index.tsx similarity index 100% rename from apps/admin/core/providers/index.tsx rename to apps/admin/providers/index.tsx diff --git a/apps/admin/core/providers/instance.provider.tsx b/apps/admin/providers/instance.provider.tsx similarity index 100% rename from apps/admin/core/providers/instance.provider.tsx rename to apps/admin/providers/instance.provider.tsx diff --git a/apps/admin/core/providers/store.provider.tsx b/apps/admin/providers/store.provider.tsx similarity index 95% rename from apps/admin/core/providers/store.provider.tsx rename to apps/admin/providers/store.provider.tsx index 9e3c9864c3..9ddb53b6b9 100644 --- a/apps/admin/core/providers/store.provider.tsx +++ b/apps/admin/providers/store.provider.tsx @@ -6,7 +6,7 @@ import { createContext } from "react"; // plane admin store -import { RootStore } from "@/plane-admin/store/root.store"; +import { RootStore } from "../store/root.store"; let rootStore = new RootStore(); diff --git a/apps/admin/core/providers/toast.tsx b/apps/admin/providers/toast.tsx similarity index 100% rename from apps/admin/core/providers/toast.tsx rename to apps/admin/providers/toast.tsx diff --git a/apps/admin/core/providers/user.provider.tsx b/apps/admin/providers/user.provider.tsx similarity index 100% rename from apps/admin/core/providers/user.provider.tsx rename to apps/admin/providers/user.provider.tsx diff --git a/apps/admin/core/store/instance.store.ts b/apps/admin/store/instance.store.ts similarity index 98% rename from apps/admin/core/store/instance.store.ts rename to apps/admin/store/instance.store.ts index 69b048093c..ed92beae11 100644 --- a/apps/admin/core/store/instance.store.ts +++ b/apps/admin/store/instance.store.ts @@ -19,7 +19,7 @@ import type { IInstanceConfig, } from "@plane/types"; // root store -import type { CoreRootStore } from "@/store/root.store"; +import type { RootStore } from "@/store/root.store"; export interface IInstanceStore { // issues @@ -53,7 +53,7 @@ export class InstanceStore implements IInstanceStore { // service instanceService; - constructor(private store: CoreRootStore) { + constructor(private store: RootStore) { makeObservable(this, { // observable isLoading: observable.ref, diff --git a/apps/admin/core/store/root.store.ts b/apps/admin/store/root.store.ts similarity index 97% rename from apps/admin/core/store/root.store.ts rename to apps/admin/store/root.store.ts index b833405552..42f0a63e5b 100644 --- a/apps/admin/core/store/root.store.ts +++ b/apps/admin/store/root.store.ts @@ -17,7 +17,7 @@ import { WorkspaceStore } from "./workspace.store"; enableStaticRendering(typeof window === "undefined"); -export abstract class CoreRootStore { +export class RootStore { theme: IThemeStore; instance: IInstanceStore; user: IUserStore; diff --git a/apps/admin/core/store/theme.store.ts b/apps/admin/store/theme.store.ts similarity index 94% rename from apps/admin/core/store/theme.store.ts rename to apps/admin/store/theme.store.ts index d8c5e170e1..bb663804fe 100644 --- a/apps/admin/core/store/theme.store.ts +++ b/apps/admin/store/theme.store.ts @@ -6,7 +6,7 @@ import { action, observable, makeObservable } from "mobx"; // root store -import type { CoreRootStore } from "@/store/root.store"; +import type { RootStore } from "./root.store"; type TTheme = "dark" | "light"; export interface IThemeStore { @@ -27,7 +27,7 @@ export class ThemeStore implements IThemeStore { isSidebarCollapsed: boolean | undefined = undefined; theme: string | undefined = undefined; - constructor(private store: CoreRootStore) { + constructor(private store: RootStore) { makeObservable(this, { // observables isNewUserPopup: observable.ref, diff --git a/apps/admin/core/store/user.store.ts b/apps/admin/store/user.store.ts similarity index 96% rename from apps/admin/core/store/user.store.ts rename to apps/admin/store/user.store.ts index 833ffb8801..c218eec0fa 100644 --- a/apps/admin/core/store/user.store.ts +++ b/apps/admin/store/user.store.ts @@ -11,7 +11,7 @@ import { EUserStatus } from "@plane/constants"; import { AuthService, UserService } from "@plane/services"; import type { IUser } from "@plane/types"; // root store -import type { CoreRootStore } from "@/store/root.store"; +import type { RootStore } from "@/store/root.store"; export interface IUserStore { // observables @@ -36,7 +36,7 @@ export class UserStore implements IUserStore { userService; authService; - constructor(private store: CoreRootStore) { + constructor(private store: RootStore) { makeObservable(this, { // observables isLoading: observable.ref, diff --git a/apps/admin/core/store/workspace.store.ts b/apps/admin/store/workspace.store.ts similarity index 97% rename from apps/admin/core/store/workspace.store.ts rename to apps/admin/store/workspace.store.ts index 610384aa42..7dbfaa1af9 100644 --- a/apps/admin/core/store/workspace.store.ts +++ b/apps/admin/store/workspace.store.ts @@ -10,7 +10,7 @@ import { action, observable, runInAction, makeObservable, computed } from "mobx" import { InstanceWorkspaceService } from "@plane/services"; import type { IWorkspace, TLoader, TPaginationInfo } from "@plane/types"; // root store -import type { CoreRootStore } from "@/store/root.store"; +import type { RootStore } from "@/store/root.store"; export interface IWorkspaceStore { // observables @@ -37,7 +37,7 @@ export class WorkspaceStore implements IWorkspaceStore { // services instanceWorkspaceService; - constructor(private store: CoreRootStore) { + constructor(private store: RootStore) { makeObservable(this, { // observables loader: observable, diff --git a/apps/admin/tsconfig.json b/apps/admin/tsconfig.json index 90dedb762e..2d04cbe81f 100644 --- a/apps/admin/tsconfig.json +++ b/apps/admin/tsconfig.json @@ -9,12 +9,7 @@ "types": ["vite/client"], "paths": { "package.json": ["./package.json"], - "ce/*": ["./ce/*"], - "@/app/*": ["./app/*"], - "@/*": ["./core/*"], - "@/plane-admin/*": ["./ce/*"], - "@/ce/*": ["./ce/*"], - "@/styles/*": ["./styles/*"] + "@/*": ["./*"] } }, "include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"], diff --git a/apps/admin/core/utils/public-asset.ts b/apps/admin/utils/public-asset.ts similarity index 100% rename from apps/admin/core/utils/public-asset.ts rename to apps/admin/utils/public-asset.ts diff --git a/apps/api/plane/app/serializers/api.py b/apps/api/plane/app/serializers/api.py index 4e86b50b93..05c6198f59 100644 --- a/apps/api/plane/app/serializers/api.py +++ b/apps/api/plane/app/serializers/api.py @@ -19,6 +19,9 @@ class APITokenSerializer(BaseSerializer): "updated_at", "workspace", "user", + "is_active", + "last_used", + "user_type", ] diff --git a/apps/api/plane/app/views/project/base.py b/apps/api/plane/app/views/project/base.py index eaec78b8c6..6b7a6f06fe 100644 --- a/apps/api/plane/app/views/project/base.py +++ b/apps/api/plane/app/views/project/base.py @@ -50,11 +50,10 @@ class ProjectViewSet(BaseViewSet): use_read_replica = True def get_queryset(self): - sort_order = ProjectMember.objects.filter( - member=self.request.user, + sort_order = ProjectUserProperty.objects.filter( + user=self.request.user, project_id=OuterRef("pk"), workspace__slug=self.kwargs.get("slug"), - is_active=True, ).values("sort_order") return self.filter_queryset( super() @@ -140,11 +139,10 @@ class ProjectViewSet(BaseViewSet): @allow_permission(allowed_roles=[ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def list(self, request, slug): - sort_order = ProjectMember.objects.filter( - member=self.request.user, + sort_order = ProjectUserProperty.objects.filter( + user=self.request.user, project_id=OuterRef("pk"), workspace__slug=self.kwargs.get("slug"), - is_active=True, ).values("sort_order") projects = ( diff --git a/apps/api/plane/app/views/workspace/base.py b/apps/api/plane/app/views/workspace/base.py index b9c7e79fdc..be43eace2f 100644 --- a/apps/api/plane/app/views/workspace/base.py +++ b/apps/api/plane/app/views/workspace/base.py @@ -49,6 +49,7 @@ from plane.bgtasks.workspace_seed_task import workspace_seed from plane.bgtasks.event_tracking_task import track_event from plane.utils.url import contains_url from plane.utils.analytics_events import WORKSPACE_CREATED, WORKSPACE_DELETED +from plane.utils.csv_utils import sanitize_csv_row class WorkSpaceViewSet(BaseViewSet): @@ -81,12 +82,14 @@ class WorkSpaceViewSet(BaseViewSet): def create(self, request): try: - (DISABLE_WORKSPACE_CREATION,) = get_configuration_value([ - { - "key": "DISABLE_WORKSPACE_CREATION", - "default": os.environ.get("DISABLE_WORKSPACE_CREATION", "0"), - } - ]) + (DISABLE_WORKSPACE_CREATION,) = get_configuration_value( + [ + { + "key": "DISABLE_WORKSPACE_CREATION", + "default": os.environ.get("DISABLE_WORKSPACE_CREATION", "0"), + } + ] + ) if DISABLE_WORKSPACE_CREATION == "1": return Response( @@ -369,7 +372,7 @@ class ExportWorkspaceUserActivityEndpoint(BaseAPIView): """Generate CSV buffer from rows.""" csv_buffer = io.StringIO() writer = csv.writer(csv_buffer, delimiter=",", quoting=csv.QUOTE_ALL) - [writer.writerow(row) for row in rows] + [writer.writerow(sanitize_csv_row(row)) for row in rows] csv_buffer.seek(0) return csv_buffer diff --git a/apps/api/plane/bgtasks/analytic_plot_export.py b/apps/api/plane/bgtasks/analytic_plot_export.py index 77ea6522db..e36314af6e 100644 --- a/apps/api/plane/bgtasks/analytic_plot_export.py +++ b/apps/api/plane/bgtasks/analytic_plot_export.py @@ -24,6 +24,7 @@ from plane.license.utils.instance_value import get_email_configuration from plane.utils.analytics_plot import build_graph_plot from plane.utils.exception_logger import log_exception from plane.utils.issue_filters import issue_filters +from plane.utils.csv_utils import sanitize_csv_row row_mapping = { "state__name": "State", @@ -180,7 +181,7 @@ def generate_csv_from_rows(rows): """Generate CSV buffer from rows.""" csv_buffer = io.StringIO() writer = csv.writer(csv_buffer, delimiter=",", quoting=csv.QUOTE_ALL) - [writer.writerow(row) for row in rows] + [writer.writerow(sanitize_csv_row(row)) for row in rows] return csv_buffer diff --git a/apps/api/plane/bgtasks/work_item_link_task.py b/apps/api/plane/bgtasks/work_item_link_task.py index b14dc75bcb..442396c7f0 100644 --- a/apps/api/plane/bgtasks/work_item_link_task.py +++ b/apps/api/plane/bgtasks/work_item_link_task.py @@ -4,6 +4,7 @@ # Python imports import logging +import socket # Third party imports from celery import shared_task @@ -26,7 +27,7 @@ DEFAULT_FAVICON = "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoP def validate_url_ip(url: str) -> None: """ Validate that a URL doesn't point to a private/internal IP address. - Only checks if the hostname is a direct IP address. + Resolves hostnames to IPs before checking. Args: url: The URL to validate @@ -38,17 +39,31 @@ def validate_url_ip(url: str) -> None: hostname = parsed.hostname if not hostname: - return + raise ValueError("Invalid URL: No hostname found") + + # Only allow HTTP and HTTPS to prevent file://, gopher://, etc. + if parsed.scheme not in ("http", "https"): + raise ValueError("Invalid URL scheme. Only HTTP and HTTPS are allowed") + + # Resolve hostname to IP addresses — this catches domain names that + # point to internal IPs (e.g. attacker.com -> 169.254.169.254) try: - ip = ipaddress.ip_address(hostname) - except ValueError: - # Not an IP address (it's a domain name), nothing to check here - return + addr_info = socket.getaddrinfo(hostname, None) + except socket.gaierror: + raise ValueError("Hostname could not be resolved") - # It IS an IP address - check if it's private/internal - if ip.is_private or ip.is_loopback or ip.is_reserved: - raise ValueError("Access to private/internal networks is not allowed") + if not addr_info: + raise ValueError("No IP addresses found for the hostname") + + # Check every resolved IP against blocked ranges to prevent SSRF + for addr in addr_info: + ip = ipaddress.ip_address(addr[4][0]) + if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: + raise ValueError("Access to private/internal networks is not allowed") + + +MAX_REDIRECTS = 5 def crawl_work_item_link_title_and_favicon(url: str) -> Dict[str, Any]: @@ -74,11 +89,23 @@ def crawl_work_item_link_title_and_favicon(url: str) -> Dict[str, Any]: validate_url_ip(final_url) try: - response = requests.get(final_url, headers=headers, timeout=1) - final_url = response.url # Get the final URL after any redirects + # Manually follow redirects to validate each URL before requesting + redirect_count = 0 + response = requests.get(final_url, headers=headers, timeout=1, allow_redirects=False) - # check for redirected url also - validate_url_ip(final_url) + while response.is_redirect and redirect_count < MAX_REDIRECTS: + redirect_url = response.headers.get("Location") + if not redirect_url: + break + # Resolve relative redirects against current URL + final_url = urljoin(final_url, redirect_url) + # Validate the redirect target BEFORE making the request + validate_url_ip(final_url) + redirect_count += 1 + response = requests.get(final_url, headers=headers, timeout=1, allow_redirects=False) + + if redirect_count >= MAX_REDIRECTS: + logger.warning(f"Too many redirects for URL: {url}") soup = BeautifulSoup(response.content, "html.parser") title_tag = soup.find("title") @@ -134,7 +161,9 @@ def find_favicon_url(soup: Optional[BeautifulSoup], base_url: str) -> Optional[s for selector in favicon_selectors: favicon_tag = soup.select_one(selector) if favicon_tag and favicon_tag.get("href"): - return urljoin(base_url, favicon_tag["href"]) + favicon_href = urljoin(base_url, favicon_tag["href"]) + validate_url_ip(favicon_href) + return favicon_href # Fallback to /favicon.ico parsed_url = urlparse(base_url) @@ -142,7 +171,9 @@ def find_favicon_url(soup: Optional[BeautifulSoup], base_url: str) -> Optional[s # Check if fallback exists try: - response = requests.head(fallback_url, timeout=2) + validate_url_ip(fallback_url) + response = requests.head(fallback_url, timeout=2, allow_redirects=False) + if response.status_code == 200: return fallback_url except requests.RequestException as e: @@ -173,6 +204,8 @@ def fetch_and_encode_favicon( "favicon_base64": f"data:image/svg+xml;base64,{DEFAULT_FAVICON}", } + validate_url_ip(favicon_url) + response = requests.get(favicon_url, headers=headers, timeout=1) # Get content type diff --git a/apps/api/plane/db/migrations/0119_alter_estimatepoint_key.py b/apps/api/plane/db/migrations/0119_alter_estimatepoint_key.py new file mode 100644 index 0000000000..a730808a16 --- /dev/null +++ b/apps/api/plane/db/migrations/0119_alter_estimatepoint_key.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.27 on 2026-02-09 09:37 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0118_remove_workspaceuserproperties_product_tour_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='estimatepoint', + name='key', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)]), + ), + ] diff --git a/apps/api/plane/db/models/estimate.py b/apps/api/plane/db/models/estimate.py index 0edd75c74d..aa1e66be11 100644 --- a/apps/api/plane/db/models/estimate.py +++ b/apps/api/plane/db/models/estimate.py @@ -38,7 +38,7 @@ class Estimate(ProjectBaseModel): class EstimatePoint(ProjectBaseModel): estimate = models.ForeignKey("db.Estimate", on_delete=models.CASCADE, related_name="points") - key = models.IntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(12)]) + key = models.IntegerField(default=0, validators=[MinValueValidator(0)]) description = models.TextField(blank=True) value = models.CharField(max_length=255) diff --git a/apps/api/plane/tests/contract/app/test_api_token.py b/apps/api/plane/tests/contract/app/test_api_token.py index 3e0d3f6621..ed071b98cb 100644 --- a/apps/api/plane/tests/contract/app/test_api_token.py +++ b/apps/api/plane/tests/contract/app/test_api_token.py @@ -142,7 +142,7 @@ class TestApiTokenEndpoint: """Test retrieving a specific API token""" # Arrange session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": create_api_token_for_user.pk}) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) # Act response = session_client.get(url) @@ -159,7 +159,7 @@ class TestApiTokenEndpoint: # Arrange session_client.force_authenticate(user=create_user) fake_pk = uuid4() - url = reverse("api-tokens", kwargs={"pk": fake_pk}) + url = reverse("api-tokens-details", kwargs={"pk": fake_pk}) # Act response = session_client.get(url) @@ -178,7 +178,7 @@ class TestApiTokenEndpoint: other_user = User.objects.create(email=unique_email, username=unique_username) other_token = APIToken.objects.create(label="Other Token", user=other_user, user_type=0) session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": other_token.pk}) + url = reverse("api-tokens-details", kwargs={"pk": other_token.pk}) # Act response = session_client.get(url) @@ -192,7 +192,7 @@ class TestApiTokenEndpoint: """Test successful API token deletion""" # Arrange session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": create_api_token_for_user.pk}) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) # Act response = session_client.delete(url) @@ -207,7 +207,7 @@ class TestApiTokenEndpoint: # Arrange session_client.force_authenticate(user=create_user) fake_pk = uuid4() - url = reverse("api-tokens", kwargs={"pk": fake_pk}) + url = reverse("api-tokens-details", kwargs={"pk": fake_pk}) # Act response = session_client.delete(url) @@ -226,7 +226,7 @@ class TestApiTokenEndpoint: other_user = User.objects.create(email=unique_email, username=unique_username) other_token = APIToken.objects.create(label="Other Token", user=other_user, user_type=0) session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": other_token.pk}) + url = reverse("api-tokens-details", kwargs={"pk": other_token.pk}) # Act response = session_client.delete(url) @@ -242,7 +242,7 @@ class TestApiTokenEndpoint: # Arrange service_token = APIToken.objects.create(label="Service Token", user=create_user, user_type=0, is_service=True) session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": service_token.pk}) + url = reverse("api-tokens-details", kwargs={"pk": service_token.pk}) # Act response = session_client.delete(url) @@ -258,7 +258,7 @@ class TestApiTokenEndpoint: """Test successful API token update""" # Arrange session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": create_api_token_for_user.pk}) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) update_data = { "label": "Updated Token Label", "description": "Updated description", @@ -282,7 +282,7 @@ class TestApiTokenEndpoint: """Test partial API token update""" # Arrange session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": create_api_token_for_user.pk}) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) original_description = create_api_token_for_user.description update_data = {"label": "Only Label Updated"} @@ -300,7 +300,7 @@ class TestApiTokenEndpoint: # Arrange session_client.force_authenticate(user=create_user) fake_pk = uuid4() - url = reverse("api-tokens", kwargs={"pk": fake_pk}) + url = reverse("api-tokens-details", kwargs={"pk": fake_pk}) update_data = {"label": "New Label"} # Act @@ -320,7 +320,7 @@ class TestApiTokenEndpoint: other_user = User.objects.create(email=unique_email, username=unique_username) other_token = APIToken.objects.create(label="Other Token", user=other_user, user_type=0) session_client.force_authenticate(user=create_user) - url = reverse("api-tokens", kwargs={"pk": other_token.pk}) + url = reverse("api-tokens-details", kwargs={"pk": other_token.pk}) update_data = {"label": "Hacked Label"} # Act @@ -333,6 +333,56 @@ class TestApiTokenEndpoint: other_token.refresh_from_db() assert other_token.label == "Other Token" + @pytest.mark.django_db + def test_patch_cannot_modify_token(self, session_client, create_user, create_api_token_for_user): + """Test that token value cannot be modified via PATCH""" + # Arrange + session_client.force_authenticate(user=create_user) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) + original_token = create_api_token_for_user.token + update_data = {"token": "plane_api_malicious_token_value"} + + # Act + response = session_client.patch(url, update_data, format="json") + + # Assert + assert response.status_code == status.HTTP_200_OK + create_api_token_for_user.refresh_from_db() + assert create_api_token_for_user.token == original_token + + @pytest.mark.django_db + def test_patch_cannot_modify_user_type(self, session_client, create_user, create_api_token_for_user): + """Test that user_type cannot be modified via PATCH""" + # Arrange + session_client.force_authenticate(user=create_user) + url = reverse("api-tokens-details", kwargs={"pk": create_api_token_for_user.pk}) + update_data = {"user_type": 1} + + # Act + response = session_client.patch(url, update_data, format="json") + + # Assert + assert response.status_code == status.HTTP_200_OK + create_api_token_for_user.refresh_from_db() + assert create_api_token_for_user.user_type == 0 + + @pytest.mark.django_db + def test_patch_cannot_modify_service_token(self, session_client, create_user): + """Test that service tokens cannot be modified through user token endpoint""" + # Arrange + service_token = APIToken.objects.create(label="Service Token", user=create_user, user_type=0, is_service=True) + session_client.force_authenticate(user=create_user) + url = reverse("api-tokens-details", kwargs={"pk": service_token.pk}) + update_data = {"label": "Hacked Service Token"} + + # Act + response = session_client.patch(url, update_data, format="json") + + # Assert + assert response.status_code == status.HTTP_404_NOT_FOUND + service_token.refresh_from_db() + assert service_token.label == "Service Token" + # Authentication tests @pytest.mark.django_db def test_all_endpoints_require_authentication(self, api_client): @@ -341,9 +391,9 @@ class TestApiTokenEndpoint: endpoints = [ (reverse("api-tokens"), "get"), (reverse("api-tokens"), "post"), - (reverse("api-tokens", kwargs={"pk": uuid4()}), "get"), - (reverse("api-tokens", kwargs={"pk": uuid4()}), "patch"), - (reverse("api-tokens", kwargs={"pk": uuid4()}), "delete"), + (reverse("api-tokens-details", kwargs={"pk": uuid4()}), "get"), + (reverse("api-tokens-details", kwargs={"pk": uuid4()}), "patch"), + (reverse("api-tokens-details", kwargs={"pk": uuid4()}), "delete"), ] # Act & Assert diff --git a/apps/api/plane/utils/csv_utils.py b/apps/api/plane/utils/csv_utils.py new file mode 100644 index 0000000000..26c6e89375 --- /dev/null +++ b/apps/api/plane/utils/csv_utils.py @@ -0,0 +1,26 @@ +# Copyright (c) 2023-present Plane Software, Inc. and contributors +# SPDX-License-Identifier: AGPL-3.0-only +# See the LICENSE file for details. + +# CSV utility functions for safe export +# Characters that trigger formula evaluation in spreadsheet applications +_CSV_FORMULA_TRIGGERS = frozenset(("=", "+", "-", "@", "\t", "\r", "\n")) + + +def sanitize_csv_value(value): + """Sanitize a value for CSV export to prevent formula injection. + + Prefixes string values starting with formula-triggering characters + with a single quote so spreadsheet applications treat them as text + instead of evaluating them as formulas. + + See: https://owasp.org/www-community/attacks/CSV_Injection + """ + if isinstance(value, str) and value and value[0] in _CSV_FORMULA_TRIGGERS: + return "'" + value + return value + + +def sanitize_csv_row(row): + """Sanitize all values in a CSV row.""" + return [sanitize_csv_value(v) for v in row] diff --git a/apps/api/plane/utils/exporters/formatters.py b/apps/api/plane/utils/exporters/formatters.py index 398ae96931..611a60fca4 100644 --- a/apps/api/plane/utils/exporters/formatters.py +++ b/apps/api/plane/utils/exporters/formatters.py @@ -9,6 +9,9 @@ from typing import Any, Dict, List, Type from openpyxl import Workbook +# Module imports +from plane.utils.csv_utils import sanitize_csv_row + class BaseFormatter: """Base class for export formatters.""" @@ -84,7 +87,7 @@ class CSVFormatter(BaseFormatter): buf = io.StringIO() writer = csv.writer(buf, delimiter=",", quoting=csv.QUOTE_ALL) for row in data: - writer.writerow(row) + writer.writerow(sanitize_csv_row(row)) buf.seek(0) return buf.getvalue() diff --git a/apps/api/plane/utils/porters/formatters.py b/apps/api/plane/utils/porters/formatters.py index 7b31f6d539..461a6a5e42 100644 --- a/apps/api/plane/utils/porters/formatters.py +++ b/apps/api/plane/utils/porters/formatters.py @@ -18,6 +18,10 @@ from typing import Any, Dict, List, Union from openpyxl import Workbook, load_workbook +# Module imports +from plane.utils.csv_utils import sanitize_csv_row, sanitize_csv_value + + class BaseFormatter(ABC): @abstractmethod def encode(self, data: List[Dict]) -> Union[str, bytes]: @@ -128,11 +132,12 @@ class CSVFormatter(BaseFormatter): # Write data rows in the same field order for row in data: - writer.writerow([row.get(key, "") for key in fieldnames]) + writer.writerow(sanitize_csv_row([row.get(key, "") for key in fieldnames])) else: writer = csv.DictWriter(output, fieldnames=fieldnames, delimiter=self.delimiter) writer.writeheader() - writer.writerows(data) + for row in data: + writer.writerow({k: sanitize_csv_value(row.get(k, "")) for k in fieldnames}) return output.getvalue() diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 52c18c706c..5724e085d0 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -1,7 +1,7 @@ # base requirements # django -Django==4.2.27 +Django==4.2.28 # rest framework djangorestframework==3.15.2 # postgres @@ -51,7 +51,7 @@ beautifulsoup4==4.12.3 # analytics posthog==3.5.0 # crypto -cryptography==44.0.1 +cryptography==46.0.5 # html validator lxml==6.0.0 # s3 diff --git a/apps/live/src/lib/pdf/node-renderers.tsx b/apps/live/src/lib/pdf/node-renderers.tsx index 7323b0d294..003d21f552 100644 --- a/apps/live/src/lib/pdf/node-renderers.tsx +++ b/apps/live/src/lib/pdf/node-renderers.tsx @@ -358,7 +358,6 @@ export const nodeRenderers: NodeRendererRegistry = { ); }, - }; type InternalRenderContext = { diff --git a/apps/live/src/services/page/core.service.ts b/apps/live/src/services/page/core.service.ts index 9d51d8236a..c3f3242cf3 100644 --- a/apps/live/src/services/page/core.service.ts +++ b/apps/live/src/services/page/core.service.ts @@ -5,17 +5,11 @@ */ import { logger } from "@plane/logger"; -import type { TPage } from "@plane/types"; +import type { TDocumentPayload, TPage } from "@plane/types"; // services import { AppError } from "@/lib/errors"; import { APIService } from "../api.service"; -export type TPageDescriptionPayload = { - description_binary: string; - description_html: string; - description: object; -}; - export type TUserMention = { id: string; display_name: string; @@ -121,7 +115,7 @@ export abstract class PageCoreService extends APIService { } } - async updateDescriptionBinary(pageId: string, data: TPageDescriptionPayload): Promise { + async updateDescriptionBinary(pageId: string, data: TDocumentPayload): Promise { try { const response = await this.patch(`${this.basePath}/pages/${pageId}/description/`, data, { headers: this.getHeader(), diff --git a/apps/live/tests/lib/pdf/pdf-rendering.test.ts b/apps/live/tests/lib/pdf/pdf-rendering.test.ts index c22103ccdc..507c6f900a 100644 --- a/apps/live/tests/lib/pdf/pdf-rendering.test.ts +++ b/apps/live/tests/lib/pdf/pdf-rendering.test.ts @@ -728,6 +728,5 @@ describe("PDF Rendering Integration", () => { expect(text).toContain("Text after image"); }); - }); }); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx index 25d431d350..f2c5aea1aa 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx @@ -24,9 +24,10 @@ import { useAppTheme } from "@/hooks/store/use-app-theme"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { useProject } from "@/hooks/store/use-project"; import { useAppRouter } from "@/hooks/use-app-router"; +// layouts +import { ProjectAuthWrapper } from "@/layouts/auth-layout/project-wrapper"; // plane web imports import { useWorkItemProperties } from "@/plane-web/hooks/use-issue-properties"; -import { ProjectAuthWrapper } from "@/plane-web/layouts/project-wrapper"; import { WorkItemDetailRoot } from "@/plane-web/components/browse/workItem-detail"; import type { Route } from "./+types/page"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx index 2e7cc3f0eb..b6706190cd 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx @@ -15,7 +15,8 @@ import { AppSidebarToggleButton } from "@/components/sidebar/sidebar-toggle-butt // hooks import { useAppTheme } from "@/hooks/store/use-app-theme"; import { useProjectNavigationPreferences } from "@/hooks/use-navigation-preferences"; -import { ProjectAuthWrapper } from "@/plane-web/layouts/project-wrapper"; +// layouts +import { ProjectAuthWrapper } from "@/layouts/auth-layout/project-wrapper"; // local imports import type { Route } from "./+types/layout"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx index 5ab4ceb315..37bed71420 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx @@ -29,7 +29,7 @@ import { useAppRouter } from "@/hooks/use-app-router"; // plane web hooks import { EPageStoreType, usePage, usePageStore } from "@/plane-web/hooks/store"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // services import { ProjectPageService, ProjectPageVersionService } from "@/services/page"; import type { Route } from "./+types/page"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx index 1182c4d33b..c3a6a29e67 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx @@ -10,8 +10,8 @@ import { Outlet } from "react-router"; // components import { getProjectActivePath } from "@/components/settings/helper"; import { SettingsMobileNav } from "@/components/settings/mobile/nav"; -// plane web imports -import { ProjectAuthWrapper } from "@/plane-web/layouts/project-wrapper"; +// layouts +import { ProjectAuthWrapper } from "@/layouts/auth-layout/project-wrapper"; // types import type { Route } from "./+types/layout"; import { ProjectSettingsSidebarRoot } from "@/components/settings/project/sidebar"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx index 5b2cc065af..61abee5ff2 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx @@ -20,7 +20,6 @@ import { useProject } from "@/hooks/store/use-project"; import { useUserPermissions } from "@/hooks/store/user"; // plane web imports import { ProjectTeamspaceList } from "@/plane-web/components/projects/teamspaces/teamspace-list"; -import { getProjectSettingsPageLabelI18nKey } from "@/plane-web/helpers/project-settings"; // local imports import type { Route } from "./+types/page"; import { MembersProjectSettingsHeader } from "./header"; @@ -49,7 +48,7 @@ function MembersSettingsPage({ params }: Route.ComponentProps) { return ( } hugging> - + diff --git a/apps/web/app/(all)/[workspaceSlug]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/layout.tsx index 17bb8dcbee..293688673a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/layout.tsx @@ -9,7 +9,7 @@ import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; import { WorkspaceContentWrapper } from "@/plane-web/components/workspace/content-wrapper"; import { AppRailVisibilityProvider } from "@/plane-web/hooks/app-rail"; import { GlobalModals } from "@/plane-web/components/common/modal/global"; -import { WorkspaceAuthWrapper } from "@/plane-web/layouts/workspace-wrapper"; +import { WorkspaceAuthWrapper } from "@/layouts/auth-layout/workspace-wrapper"; import type { Route } from "./+types/layout"; export default function WorkspaceLayout(props: Route.ComponentProps) { diff --git a/apps/web/app/(all)/create-workspace/page.tsx b/apps/web/app/(all)/create-workspace/page.tsx index 23b8b16fc9..cee5209c11 100644 --- a/apps/web/app/(all)/create-workspace/page.tsx +++ b/apps/web/app/(all)/create-workspace/page.tsx @@ -18,17 +18,17 @@ import WorkspaceCreationDisabled from "@/app/assets/workspace/workspace-creation import { CreateWorkspaceForm } from "@/components/workspace/create-workspace-form"; // hooks import { useUser, useUserProfile } from "@/hooks/store/user"; +import { useInstance } from "@/hooks/store/use-instance"; import { useAppRouter } from "@/hooks/use-app-router"; // wrappers import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; -// plane web helpers -import { getIsWorkspaceCreationDisabled } from "@/plane-web/helpers/instance.helper"; const CreateWorkspacePage = observer(function CreateWorkspacePage() { const { t } = useTranslation(); // router const router = useAppRouter(); // store hooks + const { config } = useInstance(); const { data: currentUser } = useUser(); const { updateUserProfile } = useUserProfile(); // states @@ -38,7 +38,7 @@ const CreateWorkspacePage = observer(function CreateWorkspacePage() { organization_size: "", }); // derived values - const isWorkspaceCreationDisabled = getIsWorkspaceCreationDisabled(); + const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false; // methods const getMailtoHref = () => { diff --git a/apps/web/app/(all)/invitations/page.tsx b/apps/web/app/(all)/invitations/page.tsx index 5543c492cb..3f7751ce6c 100644 --- a/apps/web/app/(all)/invitations/page.tsx +++ b/apps/web/app/(all)/invitations/page.tsx @@ -32,7 +32,7 @@ import { useAppRouter } from "@/hooks/use-app-router"; // services import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/app/(all)/onboarding/page.tsx b/apps/web/app/(all)/onboarding/page.tsx index 2f400962ab..e2479d7d52 100644 --- a/apps/web/app/(all)/onboarding/page.tsx +++ b/apps/web/app/(all)/onboarding/page.tsx @@ -20,7 +20,7 @@ import { useUser } from "@/hooks/store/user"; // wrappers import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/app/(all)/workspace-invitations/page.tsx b/apps/web/app/(all)/workspace-invitations/page.tsx index a70bf51aa7..eb9c92128d 100644 --- a/apps/web/app/(all)/workspace-invitations/page.tsx +++ b/apps/web/app/(all)/workspace-invitations/page.tsx @@ -22,7 +22,7 @@ import { useUser } from "@/hooks/store/user"; import { useAppRouter } from "@/hooks/use-app-router"; // wrappers import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // services // service initialization diff --git a/apps/web/ce/components/pages/editor/ai/menu.tsx b/apps/web/ce/components/pages/editor/ai/menu.tsx index 02bed2cf2a..0aaa6f36dd 100644 --- a/apps/web/ce/components/pages/editor/ai/menu.tsx +++ b/apps/web/ce/components/pages/editor/ai/menu.tsx @@ -16,7 +16,7 @@ import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "@plane/utils"; import { RichTextEditor } from "@/components/editor/rich-text"; // plane web constants -import { AI_EDITOR_TASKS, LOADING_TEXTS } from "@/plane-web/constants/ai"; +import { AI_EDITOR_TASKS, LOADING_TEXTS } from "@/constants/ai"; // plane web services import type { TTaskPayload } from "@/services/ai.service"; import { AIService } from "@/services/ai.service"; diff --git a/apps/web/ce/constants/project/index.ts b/apps/web/ce/constants/project/index.ts deleted file mode 100644 index 5b516d9036..0000000000 --- a/apps/web/ce/constants/project/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./settings"; diff --git a/apps/web/ce/constants/project/settings/features.tsx b/apps/web/ce/constants/project/settings/features.tsx deleted file mode 100644 index 06ebaaae3c..0000000000 --- a/apps/web/ce/constants/project/settings/features.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { ReactNode } from "react"; -// plane imports -import { CycleIcon, IntakeIcon, ModuleIcon, PageIcon, ViewsIcon } from "@plane/propel/icons"; -import type { IProject } from "@plane/types"; - -export type TProperties = { - key: string; - property: string; - title: string; - description: string; - icon: ReactNode; - isPro: boolean; - isEnabled: boolean; - renderChildren?: (currentProjectDetails: IProject, workspaceSlug: string) => ReactNode; - href?: string; -}; - -type TProjectBaseFeatureKeys = "cycles" | "modules" | "views" | "pages" | "inbox"; - -type TBaseFeatureList = { - [key in TProjectBaseFeatureKeys]: TProperties; -}; - -export const PROJECT_BASE_FEATURES_LIST: TBaseFeatureList = { - cycles: { - key: "cycles", - property: "cycle_view", - title: "Cycles", - description: "Timebox work as you see fit per project and change frequency from one period to the next.", - icon: , - isPro: false, - isEnabled: true, - }, - modules: { - key: "modules", - property: "module_view", - title: "Modules", - description: "Group work into sub-project-like set-ups with their own leads and assignees.", - icon: , - isPro: false, - isEnabled: true, - }, - views: { - key: "views", - property: "issue_views_view", - title: "Views", - description: "Save sorts, filters, and display options for later or share them.", - icon: , - isPro: false, - isEnabled: true, - }, - pages: { - key: "pages", - property: "page_view", - title: "Pages", - description: "Write anything like you write anything.", - icon: , - isPro: false, - isEnabled: true, - }, - inbox: { - key: "intake", - property: "inbox_view", - title: "Intake", - description: "Consider and discuss work items before you add them to your project.", - icon: , - isPro: false, - isEnabled: true, - }, -}; - -type TProjectFeatures = { - project_features: { - key: string; - title: string; - description: string; - featureList: TBaseFeatureList; - }; -}; - -export const PROJECT_FEATURES_LIST: TProjectFeatures = { - project_features: { - key: "projects_and_issues", - title: "Projects and work items", - description: "Toggle these on or off this project.", - featureList: PROJECT_BASE_FEATURES_LIST, - }, -}; diff --git a/apps/web/ce/constants/project/settings/index.ts b/apps/web/ce/constants/project/settings/index.ts deleted file mode 100644 index e9201fe43a..0000000000 --- a/apps/web/ce/constants/project/settings/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./features"; diff --git a/apps/web/ce/helpers/command-palette.ts b/apps/web/ce/helpers/command-palette.ts deleted file mode 100644 index 2d99c141e2..0000000000 --- a/apps/web/ce/helpers/command-palette.ts +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { TCommandPaletteActionList, TCommandPaletteShortcut, TCommandPaletteShortcutList } from "@plane/types"; -// store -import { store } from "@/lib/store-context"; - -export const getGlobalShortcutsList: () => TCommandPaletteActionList = () => { - const { toggleCreateIssueModal } = store.commandPalette; - - return { - c: { - title: "Create a new work item", - description: "Create a new work item in the current project", - action: () => { - toggleCreateIssueModal(true); - }, - }, - }; -}; - -export const getWorkspaceShortcutsList: () => TCommandPaletteActionList = () => { - const { toggleCreateProjectModal } = store.commandPalette; - - return { - p: { - title: "Create a new project", - description: "Create a new project in the current workspace", - action: () => { - toggleCreateProjectModal(true); - }, - }, - }; -}; - -export const getProjectShortcutsList: () => TCommandPaletteActionList = () => { - const { - toggleCreatePageModal, - toggleCreateModuleModal, - toggleCreateCycleModal, - toggleCreateViewModal, - toggleBulkDeleteIssueModal, - } = store.commandPalette; - - return { - d: { - title: "Create a new page", - description: "Create a new page in the current project", - action: () => { - toggleCreatePageModal({ isOpen: true }); - }, - }, - m: { - title: "Create a new module", - description: "Create a new module in the current project", - action: () => { - toggleCreateModuleModal(true); - }, - }, - q: { - title: "Create a new cycle", - description: "Create a new cycle in the current project", - action: () => { - toggleCreateCycleModal(true); - }, - }, - v: { - title: "Create a new view", - description: "Create a new view in the current project", - action: () => { - toggleCreateViewModal(true); - }, - }, - backspace: { - title: "Bulk delete work items", - description: "Bulk delete work items in the current project", - action: () => toggleBulkDeleteIssueModal(true), - }, - delete: { - title: "Bulk delete work items", - description: "Bulk delete work items in the current project", - action: () => toggleBulkDeleteIssueModal(true), - }, - }; -}; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const handleAdditionalKeyDownEvents = (e: KeyboardEvent) => null; - -export const getNavigationShortcutsList = (): TCommandPaletteShortcut[] => [ - { keys: "Ctrl,K", description: "Open command menu" }, -]; - -export const getCommonShortcutsList = (platform: string): TCommandPaletteShortcut[] => [ - { keys: "P", description: "Create project" }, - { keys: "C", description: "Create work item" }, - { keys: "Q", description: "Create cycle" }, - { keys: "M", description: "Create module" }, - { keys: "V", description: "Create view" }, - { keys: "D", description: "Create page" }, - { keys: "Delete", description: "Bulk delete work items" }, - { keys: "Shift,/", description: "Open shortcuts guide" }, - { - keys: platform === "MacOS" ? "Ctrl,control,C" : "Ctrl,Alt,C", - description: "Copy work item URL from the work item details page", - }, -]; - -export const getAdditionalShortcutsList = (): TCommandPaletteShortcutList[] => []; diff --git a/apps/web/ce/helpers/epic-analytics.ts b/apps/web/ce/helpers/epic-analytics.ts deleted file mode 100644 index eaf62a9e5f..0000000000 --- a/apps/web/ce/helpers/epic-analytics.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { TEpicAnalyticsGroup } from "@plane/types"; - -export const updateEpicAnalytics = () => { - const updateAnalytics = ( - workspaceSlug: string, - projectId: string, - epicId: string, - data: { - incrementStateGroupCount?: TEpicAnalyticsGroup; - decrementStateGroupCount?: TEpicAnalyticsGroup; - } - ) => {}; - - return { updateAnalytics }; -}; diff --git a/apps/web/ce/helpers/instance.helper.ts b/apps/web/ce/helpers/instance.helper.ts deleted file mode 100644 index 983ff2a474..0000000000 --- a/apps/web/ce/helpers/instance.helper.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { store } from "@/lib/store-context"; - -export const getIsWorkspaceCreationDisabled = () => { - const instanceConfig = store.instance.config; - - return instanceConfig?.is_workspace_creation_disabled; -}; diff --git a/apps/web/ce/helpers/issue-action-helper.ts b/apps/web/ce/helpers/issue-action-helper.ts deleted file mode 100644 index 8cf56fc82e..0000000000 --- a/apps/web/ce/helpers/issue-action-helper.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { IssueActions } from "@/hooks/use-issues-actions"; - -export const useTeamIssueActions: () => IssueActions = () => ({ - fetchIssues: () => Promise.resolve(undefined), - fetchNextIssues: () => Promise.resolve(undefined), - removeIssue: () => Promise.resolve(undefined), - updateFilters: () => Promise.resolve(undefined), -}); - -export const useTeamViewIssueActions: () => IssueActions = () => ({ - fetchIssues: () => Promise.resolve(undefined), - fetchNextIssues: () => Promise.resolve(undefined), - removeIssue: () => Promise.resolve(undefined), - updateFilters: () => Promise.resolve(undefined), -}); - -export const useTeamProjectWorkItemsActions: () => IssueActions = () => ({ - fetchIssues: () => Promise.resolve(undefined), - fetchNextIssues: () => Promise.resolve(undefined), - removeIssue: () => Promise.resolve(undefined), - updateFilters: () => Promise.resolve(undefined), -}); diff --git a/apps/web/ce/helpers/pi-chat.helper.ts b/apps/web/ce/helpers/pi-chat.helper.ts deleted file mode 100644 index d06cc1f3bf..0000000000 --- a/apps/web/ce/helpers/pi-chat.helper.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export const hideFloatingBot = () => {}; - -export const showFloatingBot = () => {}; diff --git a/apps/web/ce/helpers/project-settings.ts b/apps/web/ce/helpers/project-settings.ts deleted file mode 100644 index 05a3971978..0000000000 --- a/apps/web/ce/helpers/project-settings.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -/** - * @description Get the i18n key for the project settings page label - * @param _settingsKey - The key of the project settings page - * @param defaultLabelKey - The default i18n key for the project settings page label - * @returns The i18n key for the project settings page label - */ -export const getProjectSettingsPageLabelI18nKey = (_settingsKey: string, defaultLabelKey: string) => defaultLabelKey; diff --git a/apps/web/ce/helpers/work-item-filters/project-level.ts b/apps/web/ce/helpers/work-item-filters/project-level.ts deleted file mode 100644 index ffa5052fdd..0000000000 --- a/apps/web/ce/helpers/work-item-filters/project-level.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -// plane imports -import type { EIssuesStoreType } from "@plane/types"; -// plane web imports -import type { TWorkItemFiltersEntityProps } from "@/plane-web/hooks/work-item-filters/use-work-item-filters-config"; - -export type TGetAdditionalPropsForProjectLevelFiltersHOCParams = { - entityType: EIssuesStoreType; - workspaceSlug: string; - projectId: string; -}; - -export type TGetAdditionalPropsForProjectLevelFiltersHOC = ( - params: TGetAdditionalPropsForProjectLevelFiltersHOCParams -) => TWorkItemFiltersEntityProps; - -export const getAdditionalProjectLevelFiltersHOCProps: TGetAdditionalPropsForProjectLevelFiltersHOC = ({ - workspaceSlug, -}) => ({ - workspaceSlug, -}); diff --git a/apps/web/ce/helpers/workspace.helper.ts b/apps/web/ce/helpers/workspace.helper.ts deleted file mode 100644 index 6093c483d6..0000000000 --- a/apps/web/ce/helpers/workspace.helper.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export type TRenderSettingsLink = (workspaceSlug: string, settingKey: string) => boolean; -export const shouldRenderSettingLink: TRenderSettingsLink = (workspaceSlug, settingKey) => true; diff --git a/apps/web/ce/layouts/project-wrapper.tsx b/apps/web/ce/layouts/project-wrapper.tsx deleted file mode 100644 index 0a15f6c6a5..0000000000 --- a/apps/web/ce/layouts/project-wrapper.tsx +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { observer } from "mobx-react"; -// layouts -import { ProjectAuthWrapper as CoreProjectAuthWrapper } from "@/layouts/auth-layout/project-wrapper"; - -export type IProjectAuthWrapper = { - workspaceSlug: string; - projectId: string; - children: React.ReactNode; -}; - -export const ProjectAuthWrapper = observer(function ProjectAuthWrapper(props: IProjectAuthWrapper) { - // props - const { workspaceSlug, projectId, children } = props; - - return ( - - {children} - - ); -}); diff --git a/apps/web/ce/layouts/workspace-wrapper.tsx b/apps/web/ce/layouts/workspace-wrapper.tsx deleted file mode 100644 index 239551949c..0000000000 --- a/apps/web/ce/layouts/workspace-wrapper.tsx +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { FC } from "react"; -import { observer } from "mobx-react"; -// layouts -import { WorkspaceAuthWrapper as CoreWorkspaceAuthWrapper } from "@/layouts/auth-layout/workspace-wrapper"; - -export type IWorkspaceAuthWrapper = { - children: React.ReactNode; -}; - -export const WorkspaceAuthWrapper = observer(function WorkspaceAuthWrapper(props: IWorkspaceAuthWrapper) { - // props - const { children } = props; - - return {children}; -}); diff --git a/apps/web/ce/services/index.ts b/apps/web/ce/services/index.ts deleted file mode 100644 index 998e3e9a46..0000000000 --- a/apps/web/ce/services/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./project"; -export * from "@/services/workspace.service"; diff --git a/apps/web/ce/services/project/index.ts b/apps/web/ce/services/project/index.ts deleted file mode 100644 index 870a66a181..0000000000 --- a/apps/web/ce/services/project/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./estimate.service"; -export * from "@/services/view.service"; diff --git a/apps/web/ce/services/project/project-state.service.ts b/apps/web/ce/services/project/project-state.service.ts deleted file mode 100644 index 74aa51083c..0000000000 --- a/apps/web/ce/services/project/project-state.service.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "@/services/project/project-state.service"; diff --git a/apps/web/ce/store/estimates/estimate.ts b/apps/web/ce/store/estimates/estimate.ts index d85b1ef6e2..805c00df8d 100644 --- a/apps/web/ce/store/estimates/estimate.ts +++ b/apps/web/ce/store/estimates/estimate.ts @@ -14,7 +14,7 @@ import type { TEstimateSystemKeys, } from "@plane/types"; // plane web services -import estimateService from "@/plane-web/services/project/estimate.service"; +import estimateService from "@/services/estimate.service"; // store import type { IEstimatePoint } from "@/store/estimates/estimate-point"; import { EstimatePoint } from "@/store/estimates/estimate-point"; diff --git a/apps/web/core/components/account/auth-forms/auth-header.tsx b/apps/web/core/components/account/auth-forms/auth-header.tsx index ef72b49cc1..239d658291 100644 --- a/apps/web/core/components/account/auth-forms/auth-header.tsx +++ b/apps/web/core/components/account/auth-forms/auth-header.tsx @@ -14,7 +14,7 @@ import { WorkspaceLogo } from "@/components/workspace/logo"; // helpers import { EAuthModes, EAuthSteps } from "@/helpers/authentication.helper"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; type TAuthHeader = { workspaceSlug: string | undefined; diff --git a/apps/web/core/components/editor/lite-text/editor.tsx b/apps/web/core/components/editor/lite-text/editor.tsx index 97e41d6420..5dd50e0c2e 100644 --- a/apps/web/core/components/editor/lite-text/editor.tsx +++ b/apps/web/core/components/editor/lite-text/editor.tsx @@ -23,7 +23,7 @@ import { useParseEditorContent } from "@/hooks/use-parse-editor-content"; // plane web hooks import { useEditorFlagging } from "@/plane-web/hooks/use-editor-flagging"; // plane web service -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; import { LiteToolbar } from "./lite-toolbar"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/core/components/editor/rich-text/description-input/root.tsx b/apps/web/core/components/editor/rich-text/description-input/root.tsx index 188a1f046f..fefa49f9cc 100644 --- a/apps/web/core/components/editor/rich-text/description-input/root.tsx +++ b/apps/web/core/components/editor/rich-text/description-input/root.tsx @@ -19,7 +19,7 @@ import { RichTextEditor } from "@/components/editor/rich-text"; import { useEditorAsset } from "@/hooks/store/use-editor-asset"; import { useWorkspace } from "@/hooks/store/use-workspace"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // local imports import { DescriptionInputLoader } from "./loader"; // services init @@ -119,6 +119,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) }); // ref to track if there are unsaved changes const hasUnsavedChanges = useRef(false); + // ref to track last saved content (to skip onChange when content hasn't actually changed) + const lastSavedContent = useRef(initialValue?.trim() === "" ? "

" : (initialValue ?? "

")); // store hooks const { getWorkspaceBySlug } = useWorkspace(); const { uploadEditorAsset, duplicateEditorAsset } = useEditorAsset(); @@ -139,6 +141,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) const handleDescriptionFormSubmit = useCallback( async (formData: TFormData) => { await onSubmit(formData.description_html, formData.isMigrationUpdate); + // Update lastSavedContent after successful save + lastSavedContent.current = formData.description_html; }, [onSubmit] ); @@ -146,14 +150,17 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) // reset form values useEffect(() => { if (!entityId) return; + const normalizedValue = initialValue?.trim() === "" ? "

" : (initialValue ?? "

"); + // Update last saved content when entity/initialValue changes + lastSavedContent.current = normalizedValue; reset({ id: entityId, - description_html: initialValue?.trim() === "" ? "

" : (initialValue ?? "

"), + description_html: normalizedValue, isMigrationUpdate: false, }); setLocalDescription({ id: entityId, - description_html: initialValue?.trim() === "" ? "

" : (initialValue ?? "

"), + description_html: normalizedValue, isMigrationUpdate: false, }); // Reset unsaved changes flag when form is reset @@ -219,6 +226,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) projectId={projectId} dragDropEnabled onChange={(_description, description_html, options) => { + // Skip if content hasn't actually changed (handles editor normalization on init) + if (description_html === lastSavedContent.current) return; setIsSubmitting("submitting"); onChange(description_html); setValue("isMigrationUpdate", options?.isMigrationUpdate ?? false); diff --git a/apps/web/core/components/home/widgets/recents/index.tsx b/apps/web/core/components/home/widgets/recents/index.tsx index 172c3efd8a..988f079a17 100644 --- a/apps/web/core/components/home/widgets/recents/index.tsx +++ b/apps/web/core/components/home/widgets/recents/index.tsx @@ -15,7 +15,7 @@ import type { TActivityEntityData, THomeWidgetProps, TRecentActivityFilterKeys } // components import { ContentOverflowWrapper } from "@/components/core/content-overflow-HOC"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; import { RecentsEmptyState } from "../empty-states"; import { EWidgetKeys, WidgetLoader } from "../loaders"; import { FiltersDropdown } from "./filters"; diff --git a/apps/web/core/components/inbox/content/issue-root.tsx b/apps/web/core/components/inbox/content/issue-root.tsx index a41b385827..530c7c3abd 100644 --- a/apps/web/core/components/inbox/content/issue-root.tsx +++ b/apps/web/core/components/inbox/content/issue-root.tsx @@ -185,7 +185,6 @@ export const InboxIssueMainContent = observer(function InboxIssueMainContent(pro }} projectId={issue.project_id} setIsSubmitting={(value) => setIsSubmitting(value)} - swrDescription={issue.description_html ?? "

"} workspaceSlug={workspaceSlug} /> )} diff --git a/apps/web/core/components/inbox/modals/create-modal/issue-description.tsx b/apps/web/core/components/inbox/modals/create-modal/issue-description.tsx index 3f67c5002c..f67f9b25d4 100644 --- a/apps/web/core/components/inbox/modals/create-modal/issue-description.tsx +++ b/apps/web/core/components/inbox/modals/create-modal/issue-description.tsx @@ -21,7 +21,7 @@ import { useEditorAsset } from "@/hooks/store/use-editor-asset"; import { useProjectInbox } from "@/hooks/store/use-project-inbox"; import { usePlatformOS } from "@/hooks/use-platform-os"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts index 35f941e89a..8cf524ed9a 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts @@ -5,7 +5,6 @@ */ import { useMemo } from "react"; -import { useParams } from "next/navigation"; // plane imports import { useTranslation } from "@plane/i18n"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; @@ -14,18 +13,12 @@ import { EIssueServiceType } from "@plane/types"; import { copyUrlToClipboard } from "@plane/utils"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; -import { useProjectState } from "@/hooks/store/use-project-state"; -// plane web helpers -import { updateEpicAnalytics } from "@/plane-web/helpers/epic-analytics"; export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSubIssueOperations => { - // router - const { epicId: epicIdParam } = useParams(); // translation const { t } = useTranslation(); // store hooks const { - issue: { getIssueById }, subIssues: { setSubIssueHelpers }, createSubIssues, fetchSubIssues, @@ -33,13 +26,6 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub deleteSubIssue, removeSubIssue, } = useIssueDetail(issueServiceType); - const { getStateById } = useProjectState(); - const { peekIssue: epicPeekIssue } = useIssueDetail(EIssueServiceType.EPICS); - // const { updateEpicAnalytics } = useIssueTypes(); - const { updateAnalytics } = updateEpicAnalytics(); - - // derived values - const epicId = epicIdParam || epicPeekIssue?.issueId; const subIssueOperations: TSubIssueOperations = useMemo( () => ({ @@ -110,30 +96,6 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub try { setSubIssueHelpers(parentIssueId, "issue_loader", issueId); await updateSubIssue(workspaceSlug, projectId, parentIssueId, issueId, issueData, oldIssue, fromModal); - - if (issueServiceType === EIssueServiceType.EPICS) { - const oldState = getStateById(oldIssue?.state_id)?.group; - - if (oldState && oldIssue && issueData && epicId) { - // Check if parent_id is changed if yes then decrement the epic analytics count - if (issueData.parent_id && oldIssue?.parent_id && issueData.parent_id !== oldIssue?.parent_id) { - updateAnalytics(workspaceSlug, projectId, epicId.toString(), { - decrementStateGroupCount: `${oldState}_issues`, - }); - } - - // Check if state_id is changed if yes then decrement the old state group count and increment the new state group count - if (issueData.state_id) { - const newState = getStateById(issueData.state_id)?.group; - if (oldState && newState && oldState !== newState) { - updateAnalytics(workspaceSlug, projectId, epicId.toString(), { - decrementStateGroupCount: `${oldState}_issues`, - incrementStateGroupCount: `${newState}_issues`, - }); - } - } - } - } setToast({ type: TOAST_TYPE.SUCCESS, title: t("toast.success"), @@ -152,16 +114,6 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub try { setSubIssueHelpers(parentIssueId, "issue_loader", issueId); await removeSubIssue(workspaceSlug, projectId, parentIssueId, issueId); - if (issueServiceType === EIssueServiceType.EPICS) { - const issueBeforeRemoval = getIssueById(issueId); - const oldState = getStateById(issueBeforeRemoval?.state_id)?.group; - - if (epicId && oldState) { - updateAnalytics(workspaceSlug, projectId, epicId.toString(), { - decrementStateGroupCount: `${oldState}_issues`, - }); - } - } setToast({ type: TOAST_TYPE.SUCCESS, title: t("toast.success"), @@ -189,9 +141,8 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub deleteSubIssue: async (workspaceSlug, projectId, parentIssueId, issueId) => { try { setSubIssueHelpers(parentIssueId, "issue_loader", issueId); - return deleteSubIssue(workspaceSlug, projectId, parentIssueId, issueId).then(() => { - setSubIssueHelpers(parentIssueId, "issue_loader", issueId); - }); + await deleteSubIssue(workspaceSlug, projectId, parentIssueId, issueId); + setSubIssueHelpers(parentIssueId, "issue_loader", issueId); } catch (_error) { setToast({ type: TOAST_TYPE.ERROR, @@ -209,15 +160,11 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub [ createSubIssues, deleteSubIssue, - epicId, fetchSubIssues, - getIssueById, - getStateById, issueServiceType, removeSubIssue, setSubIssueHelpers, t, - updateAnalytics, updateSubIssue, ] ); diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx index 31c3635ee8..3eeccb58be 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx @@ -6,15 +6,12 @@ import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane constants import { ISSUE_DISPLAY_PROPERTIES } from "@plane/constants"; // plane i18n import { useTranslation } from "@plane/i18n"; // types import type { IIssueDisplayProperties } from "@plane/types"; -// plane web helpers -import { shouldRenderDisplayProperty } from "@/plane-web/helpers/issue-filter.helper"; // components import { FilterHeader } from "../helpers/filter-header"; @@ -38,12 +35,8 @@ export const FilterDisplayProperties = observer(function FilterDisplayProperties } = props; // hooks const { t } = useTranslation(); - // router - const { workspaceSlug, projectId: routerProjectId } = useParams(); // states const [previewEnabled, setPreviewEnabled] = React.useState(true); - // derived values - const projectId = routerProjectId ? routerProjectId?.toString() : undefined; // Filter out "cycle" and "module" keys if cycleViewDisabled or moduleViewDisabled is true // Also filter out display properties that should not be rendered @@ -55,7 +48,7 @@ export const FilterDisplayProperties = observer(function FilterDisplayProperties case "modules": return !moduleViewDisabled; default: - return shouldRenderDisplayProperty({ workspaceSlug: workspaceSlug?.toString(), projectId, key: property.key }); + return true; } }).map((property) => { if (isEpic && property.key === "sub_issue_count") { diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx index c639103967..ad0adf91be 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx @@ -10,7 +10,7 @@ import { observer } from "mobx-react"; import type { IIssueDisplayProperties, TIssue } from "@plane/types"; // components import { SPREADSHEET_COLUMNS } from "@/plane-web/components/issues/issue-layouts/utils"; -import { shouldRenderColumn } from "@/plane-web/helpers/issue-filter.helper"; +import { shouldRenderColumn } from "@/helpers/issue-filter.helper"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; type Props = { diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx index be12503cfc..5d174a61d1 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx @@ -9,7 +9,7 @@ import { useRef } from "react"; import { observer } from "mobx-react"; import type { IIssueDisplayFilterOptions, IIssueDisplayProperties } from "@plane/types"; //components -import { shouldRenderColumn } from "@/plane-web/helpers/issue-filter.helper"; +import { shouldRenderColumn } from "@/helpers/issue-filter.helper"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; import { HeaderColumn } from "./columns/header-column"; diff --git a/apps/web/core/components/issues/issue-modal/components/description-editor.tsx b/apps/web/core/components/issues/issue-modal/components/description-editor.tsx index fec4651dcd..5a20b6c1c5 100644 --- a/apps/web/core/components/issues/issue-modal/components/description-editor.tsx +++ b/apps/web/core/components/issues/issue-modal/components/description-editor.tsx @@ -29,7 +29,7 @@ import { useWorkspace } from "@/hooks/store/use-workspace"; import useKeypress from "@/hooks/use-keypress"; import { usePlatformOS } from "@/hooks/use-platform-os"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // services import { AIService } from "@/services/ai.service"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/core/components/issues/issue-modal/context/issue-modal-context.tsx b/apps/web/core/components/issues/issue-modal/context/issue-modal-context.tsx index 40ee76539d..fa7ea1ab0a 100644 --- a/apps/web/core/components/issues/issue-modal/context/issue-modal-context.tsx +++ b/apps/web/core/components/issues/issue-modal/context/issue-modal-context.tsx @@ -12,7 +12,7 @@ import type { EditorRefApi } from "@plane/editor"; import type { ISearchIssueResponse, TIssue } from "@plane/types"; // plane web imports import type { TIssuePropertyValues, TIssuePropertyValueErrors } from "@/plane-web/types/issue-types"; -import type { TIssueFields } from "ce/components/issues/issue-modal"; +import type { TIssueFields } from "@/plane-web/components/issues/issue-modal"; export type TPropertyValuesValidationProps = { projectId: string | null; diff --git a/apps/web/core/components/issues/peek-overview/view.tsx b/apps/web/core/components/issues/peek-overview/view.tsx index a821a8bad9..a55a260e59 100644 --- a/apps/web/core/components/issues/peek-overview/view.tsx +++ b/apps/web/core/components/issues/peek-overview/view.tsx @@ -96,7 +96,8 @@ export const IssueView = observer(function IssueView(props: IIssueView) { } } }, - issueId + issueId, + ["main-sidebar"] ); const handleKeyDown = () => { diff --git a/apps/web/core/components/issues/title-input.tsx b/apps/web/core/components/issues/title-input.tsx index 189d1b9aca..8befc5ac12 100644 --- a/apps/web/core/components/issues/title-input.tsx +++ b/apps/web/core/components/issues/title-input.tsx @@ -45,7 +45,7 @@ export const IssueTitleInput = observer(function IssueTitleInput(props: IssueTit } = props; const { t } = useTranslation(); // states - const [title, setTitle] = useState(""); + const [title, setTitle] = useState(value || ""); const [isLengthVisible, setIsLengthVisible] = useState(false); // ref to track if there are unsaved changes const hasUnsavedChanges = useRef(false); diff --git a/apps/web/core/components/onboarding/create-or-join-workspaces.tsx b/apps/web/core/components/onboarding/create-or-join-workspaces.tsx index 0c94f9fd80..7a5728a3c5 100644 --- a/apps/web/core/components/onboarding/create-or-join-workspaces.tsx +++ b/apps/web/core/components/onboarding/create-or-join-workspaces.tsx @@ -4,7 +4,7 @@ * See the LICENSE file for details. */ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { OctagonAlert } from "lucide-react"; // plane imports @@ -13,8 +13,7 @@ import type { IWorkspaceMemberInvitation, TOnboardingSteps } from "@plane/types" import { LogoSpinner } from "@/components/common/logo-spinner"; // hooks import { useUser } from "@/hooks/store/user"; -// plane web helpers -import { getIsWorkspaceCreationDisabled } from "@/plane-web/helpers/instance.helper"; +import { useInstance } from "@/hooks/store/use-instance"; // local imports import { CreateWorkspace } from "./create-workspace"; import { Invitations } from "./invitations"; @@ -33,13 +32,14 @@ type Props = { }; export const CreateOrJoinWorkspaces = observer(function CreateOrJoinWorkspaces(props: Props) { - const { invitations, totalSteps, stepChange, finishOnboarding } = props; + const { invitations, stepChange, finishOnboarding } = props; // states const [currentView, setCurrentView] = useState(null); // store hooks const { data: user } = useUser(); + const { config } = useInstance(); // derived values - const isWorkspaceCreationEnabled = getIsWorkspaceCreationDisabled() === false; + const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false; useEffect(() => { if (invitations.length > 0) { @@ -66,7 +66,7 @@ export const CreateOrJoinWorkspaces = observer(function CreateOrJoinWorkspaces(p handleCurrentViewChange={() => setCurrentView(ECreateOrJoinWorkspaceViews.WORKSPACE_CREATE)} /> ) : currentView === ECreateOrJoinWorkspaceViews.WORKSPACE_CREATE ? ( - isWorkspaceCreationEnabled ? ( + !isWorkspaceCreationDisabled ? ( ) => Promise; diff --git a/apps/web/core/components/onboarding/invitations.tsx b/apps/web/core/components/onboarding/invitations.tsx index e9ed76f78e..e293b8851b 100644 --- a/apps/web/core/components/onboarding/invitations.tsx +++ b/apps/web/core/components/onboarding/invitations.tsx @@ -20,7 +20,7 @@ import { WorkspaceLogo } from "@/components/workspace/logo"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserSettings } from "@/hooks/store/user"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; type Props = { invitations: IWorkspaceMemberInvitation[]; diff --git a/apps/web/core/components/onboarding/invite-members.tsx b/apps/web/core/components/onboarding/invite-members.tsx index 01b5b1f15f..bf13c67e91 100644 --- a/apps/web/core/components/onboarding/invite-members.tsx +++ b/apps/web/core/components/onboarding/invite-members.tsx @@ -31,7 +31,7 @@ import type { IUser, IWorkspace } from "@plane/types"; // ui import { Input, Spinner } from "@plane/ui"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // components import { SwitchAccountDropdown } from "./switch-account-dropdown"; diff --git a/apps/web/core/components/onboarding/steps/team/root.tsx b/apps/web/core/components/onboarding/steps/team/root.tsx index 12b3345f84..8ba63eb28a 100644 --- a/apps/web/core/components/onboarding/steps/team/root.tsx +++ b/apps/web/core/components/onboarding/steps/team/root.tsx @@ -30,7 +30,7 @@ import { Input, Spinner } from "@plane/ui"; // hooks import { useWorkspace } from "@/hooks/store/use-workspace"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // components import { CommonOnboardingHeader } from "../common"; diff --git a/apps/web/core/components/onboarding/steps/workspace/create.tsx b/apps/web/core/components/onboarding/steps/workspace/create.tsx index 2f5669f144..6b5eccf264 100644 --- a/apps/web/core/components/onboarding/steps/workspace/create.tsx +++ b/apps/web/core/components/onboarding/steps/workspace/create.tsx @@ -17,11 +17,11 @@ import type { IUser, IWorkspace } from "@plane/types"; import { Spinner } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks +import { useInstance } from "@/hooks/store/use-instance"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserProfile, useUserSettings } from "@/hooks/store/user"; -// plane-web imports -import { getIsWorkspaceCreationDisabled } from "@/plane-web/helpers/instance.helper"; -import { WorkspaceService } from "@/plane-web/services"; +// services +import { WorkspaceService } from "@/services/workspace.service"; // local components import { CommonOnboardingHeader } from "../common"; @@ -46,11 +46,12 @@ export const WorkspaceCreateStep = observer(function WorkspaceCreateStep({ // plane hooks const { t } = useTranslation(); // store hooks + const { config } = useInstance(); const { updateUserProfile } = useUserProfile(); const { fetchCurrentUserSettings } = useUserSettings(); const { createWorkspace, fetchWorkspaces } = useWorkspace(); - const isWorkspaceCreationEnabled = getIsWorkspaceCreationDisabled() === false; + const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false; // form info const { @@ -113,7 +114,7 @@ export const WorkspaceCreateStep = observer(function WorkspaceCreateStep({ const isButtonDisabled = !isValid || invalidSlug || isSubmitting; - if (!isWorkspaceCreationEnabled) { + if (isWorkspaceCreationDisabled) { return (
diff --git a/apps/web/core/components/onboarding/steps/workspace/join-invites.tsx b/apps/web/core/components/onboarding/steps/workspace/join-invites.tsx index 81286f4aed..ec50bb97ca 100644 --- a/apps/web/core/components/onboarding/steps/workspace/join-invites.tsx +++ b/apps/web/core/components/onboarding/steps/workspace/join-invites.tsx @@ -17,7 +17,7 @@ import { WorkspaceLogo } from "@/components/workspace/logo"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserSettings } from "@/hooks/store/user"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // local components import { CommonOnboardingHeader } from "../common"; diff --git a/apps/web/core/components/pages/editor/toolbar/options-dropdown.tsx b/apps/web/core/components/pages/editor/toolbar/options-dropdown.tsx index 72438d1512..291f3cb47c 100644 --- a/apps/web/core/components/pages/editor/toolbar/options-dropdown.tsx +++ b/apps/web/core/components/pages/editor/toolbar/options-dropdown.tsx @@ -138,12 +138,12 @@ export const PageOptionsDropdown = observer(function PageOptionsDropdown(props: optionsOrder={[ "full-screen", "sticky-toolbar", + "copy-markdown", + "version-history", "make-a-copy", - "toggle-access", "archive-restore", "delete", - "version-history", - "copy-markdown", + "toggle-access", "export", ]} page={page} diff --git a/apps/web/core/components/power-k/config/creation/command.ts b/apps/web/core/components/power-k/config/creation/command.ts index fb1ff07d93..f63baa929a 100644 --- a/apps/web/core/components/power-k/config/creation/command.ts +++ b/apps/web/core/components/power-k/config/creation/command.ts @@ -15,8 +15,7 @@ import type { TPowerKCommandConfig, TPowerKContext } from "@/components/power-k/ import { useCommandPalette } from "@/hooks/store/use-command-palette"; import { useProject } from "@/hooks/store/use-project"; import { useUser } from "@/hooks/store/user"; -// plane web imports -import { getIsWorkspaceCreationDisabled } from "@/plane-web/helpers/instance.helper"; +import { useInstance } from "@/hooks/store/use-instance"; export type TPowerKCreationCommandKeys = | "create_work_item" @@ -32,6 +31,7 @@ export type TPowerKCreationCommandKeys = */ export const usePowerKCreationCommandsRecord = (): Record => { // store + const { config } = useInstance(); const { canPerformAnyCreateAction, permission: { allowPermissions }, @@ -58,7 +58,7 @@ export const usePowerKCreationCommandsRecord = (): Record ctx.params.projectId ? getPartialProjectById(ctx.params.projectId.toString()) : undefined; diff --git a/apps/web/core/components/power-k/ui/modal/search-menu.tsx b/apps/web/core/components/power-k/ui/modal/search-menu.tsx index 9092d27729..b24f29b85f 100644 --- a/apps/web/core/components/power-k/ui/modal/search-menu.tsx +++ b/apps/web/core/components/power-k/ui/modal/search-menu.tsx @@ -15,7 +15,7 @@ import { usePowerK } from "@/hooks/store/use-power-k"; import useDebounce from "@/hooks/use-debounce"; // plane web imports import { PowerKModalNoSearchResultsCommand } from "@/plane-web/components/command-palette/power-k/search/no-results-command"; -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // local imports import type { TPowerKContext, TPowerKPageType } from "../../core/types"; import { PowerKModalSearchResults } from "./search-results"; diff --git a/apps/web/core/components/power-k/ui/pages/open-entity/workspace-settings-menu.tsx b/apps/web/core/components/power-k/ui/pages/open-entity/workspace-settings-menu.tsx index 6520ed2f80..7dc8805b95 100644 --- a/apps/web/core/components/power-k/ui/pages/open-entity/workspace-settings-menu.tsx +++ b/apps/web/core/components/power-k/ui/pages/open-entity/workspace-settings-menu.tsx @@ -14,8 +14,6 @@ import { PowerKSettingsMenu } from "@/components/power-k/menus/settings"; import { WORKSPACE_SETTINGS_ICONS } from "@/components/settings/workspace/sidebar/item-icon"; // hooks import { useUserPermissions } from "@/hooks/store/user"; -// plane web imports -import { shouldRenderSettingLink } from "@/plane-web/helpers/workspace.helper"; type Props = { context: TPowerKContext; @@ -32,7 +30,6 @@ export const PowerKOpenWorkspaceSettingsMenu = observer(function PowerKOpenWorks const settingsList = Object.values(WORKSPACE_SETTINGS).filter( (setting) => context.params.workspaceSlug && - shouldRenderSettingLink(context.params.workspaceSlug?.toString(), setting.key) && allowPermissions(setting.access, EUserPermissionsLevel.WORKSPACE, context.params.workspaceSlug?.toString()) ); const settingsListWithIcons = settingsList.map((setting) => ({ diff --git a/apps/web/core/components/power-k/ui/pages/work-item-selection-page.tsx b/apps/web/core/components/power-k/ui/pages/work-item-selection-page.tsx index 9dc9b4dabe..543c262364 100644 --- a/apps/web/core/components/power-k/ui/pages/work-item-selection-page.tsx +++ b/apps/web/core/components/power-k/ui/pages/work-item-selection-page.tsx @@ -4,7 +4,7 @@ * See the LICENSE file for details. */ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; // plane imports // import { useTranslation } from "@plane/i18n"; import type { TIssueEntityData, TIssueSearchResponse, TActivityEntityData } from "@plane/types"; @@ -18,7 +18,7 @@ import type { TIssueEntityData, TIssueSearchResponse, TActivityEntityData } from // import { useAppRouter } from "@/hooks/use-app-router"; // plane web imports // import { IssueIdentifier } from "@/plane-web/components/issues/issue-details/issue-identifier"; -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; const workspaceService = new WorkspaceService(); diff --git a/apps/web/core/components/project/settings/features-list.tsx b/apps/web/core/components/project/settings/features-list.tsx index 1d15734a55..8605bf5080 100644 --- a/apps/web/core/components/project/settings/features-list.tsx +++ b/apps/web/core/components/project/settings/features-list.tsx @@ -10,6 +10,7 @@ import { useTranslation } from "@plane/i18n"; import { setPromiseToast } from "@plane/propel/toast"; import { Tooltip } from "@plane/propel/tooltip"; import type { IProject } from "@plane/types"; +import { CycleIcon, IntakeIcon, ModuleIcon, PageIcon, ViewsIcon } from "@plane/propel/icons"; // components import { SettingsBoxedControlItem } from "@/components/settings/boxed-control-item"; import { SettingsHeading } from "@/components/settings/heading"; @@ -17,7 +18,6 @@ import { SettingsHeading } from "@/components/settings/heading"; import { useProject } from "@/hooks/store/use-project"; // plane web imports import { UpgradeBadge } from "@/plane-web/components/workspace/upgrade-badge"; -import { PROJECT_FEATURES_LIST } from "@/plane-web/constants/project/settings"; // local imports import { ProjectFeatureToggle } from "./helper"; @@ -27,6 +27,54 @@ type Props = { isAdmin: boolean; }; +const PROJECT_FEATURES_LIST = { + cycles: { + key: "cycles", + property: "cycle_view", + title: "Cycles", + description: "Timebox work as you see fit per project and change frequency from one period to the next.", + icon: , + isPro: false, + isEnabled: true, + }, + modules: { + key: "modules", + property: "module_view", + title: "Modules", + description: "Group work into sub-project-like set-ups with their own leads and assignees.", + icon: , + isPro: false, + isEnabled: true, + }, + views: { + key: "views", + property: "issue_views_view", + title: "Views", + description: "Save sorts, filters, and display options for later or share them.", + icon: , + isPro: false, + isEnabled: true, + }, + pages: { + key: "pages", + property: "page_view", + title: "Pages", + description: "Write anything like you write anything.", + icon: , + isPro: false, + isEnabled: true, + }, + inbox: { + key: "intake", + property: "inbox_view", + title: "Intake", + description: "Consider and discuss work items before you add them to your project.", + icon: , + isPro: false, + isEnabled: true, + }, +}; + export const ProjectFeaturesList = observer(function ProjectFeaturesList(props: Props) { const { workspaceSlug, projectId, isAdmin } = props; // store hooks @@ -62,43 +110,41 @@ export const ProjectFeaturesList = observer(function ProjectFeaturesList(props: return ( <> - {Object.entries(PROJECT_FEATURES_LIST).map(([featureSectionKey, feature]) => ( -
- -
- {Object.entries(feature.featureList).map(([featureItemKey, featureItem]) => ( -
- - {t(featureItem.key)} - {featureItem.isPro && ( - - - - )} - - } - description={t(`${featureItem.key}_description`)} - control={ - - } - /> - {currentProjectDetails?.[featureItem.property as keyof IProject] && ( -
{featureItem.renderChildren?.(currentProjectDetails, workspaceSlug)}
- )} -
- ))} -
+
+ +
+ {Object.entries(PROJECT_FEATURES_LIST).map(([featureItemKey, featureItem]) => ( +
+ + {t(featureItem.key)} + {featureItem.isPro && ( + + + + )} + + } + description={t(`${featureItem.key}_description`)} + control={ + + } + /> + {/* {currentProjectDetails?.[featureItem.property as keyof IProject] && ( +
{featureItem.renderChildren?.(currentProjectDetails, workspaceSlug)}
+ )} */} +
+ ))}
- ))} +
); }); diff --git a/apps/web/core/components/project/settings/helper.tsx b/apps/web/core/components/project/settings/helper.tsx index 6be3106087..8911cc8c1a 100644 --- a/apps/web/core/components/project/settings/helper.tsx +++ b/apps/web/core/components/project/settings/helper.tsx @@ -10,12 +10,11 @@ import { ChevronRightIcon } from "@plane/propel/icons"; import { EPillVariant, Pill, EPillSize } from "@plane/propel/pill"; import { ToggleSwitch } from "@plane/ui"; import { joinUrlPath } from "@plane/utils"; -import type { TProperties } from "@/plane-web/constants/project/settings/features"; type Props = { workspaceSlug: string; projectId: string; - featureItem: TProperties; + featureItem: any; value: boolean; handleSubmit: (featureKey: string, featureProperty: string) => void; disabled?: boolean; @@ -23,8 +22,8 @@ type Props = { export function ProjectFeatureToggle(props: Props) { const { workspaceSlug, projectId, featureItem, value, handleSubmit, disabled } = props; - return featureItem.href ? ( - + return featureItem?.href ? ( +
handleSubmit(featureItem.key, featureItem.property)} + onChange={() => handleSubmit(featureItem?.key, featureItem?.property)} disabled={disabled} size="sm" data-ph-element={PROJECT_TRACKER_ELEMENTS.TOGGLE_FEATURE} diff --git a/apps/web/core/components/settings/profile/content/pages/preferences/default-list.tsx b/apps/web/core/components/settings/profile/content/pages/preferences/default-list.tsx index 9f780ab314..8b3b010fca 100644 --- a/apps/web/core/components/settings/profile/content/pages/preferences/default-list.tsx +++ b/apps/web/core/components/settings/profile/content/pages/preferences/default-list.tsx @@ -6,7 +6,7 @@ import { observer } from "mobx-react"; // components -import { ThemeSwitcher } from "ce/components/preferences/theme-switcher"; +import { ThemeSwitcher } from "@/plane-web/components/preferences/theme-switcher"; export const ProfileSettingsDefaultPreferencesList = observer(function ProfileSettingsDefaultPreferencesList() { return ( diff --git a/apps/web/core/components/sidebar/resizable-sidebar.tsx b/apps/web/core/components/sidebar/resizable-sidebar.tsx index 155547a6c8..ba2f123bd8 100644 --- a/apps/web/core/components/sidebar/resizable-sidebar.tsx +++ b/apps/web/core/components/sidebar/resizable-sidebar.tsx @@ -178,6 +178,7 @@ export function ResizableSidebar({ <> {/* Main Sidebar */}
- {isWorkspaceCreationEnabled && ( + {!isWorkspaceCreationDisabled && ( { - const teamIssueActions = useTeamIssueActions(); const projectIssueActions = useProjectIssueActions(); const projectEpicsActions = useProjectEpicsActions(); const cycleIssueActions = useCycleIssueActions(); const moduleIssueActions = useModuleIssueActions(); - const teamViewIssueActions = useTeamViewIssueActions(); const projectViewIssueActions = useProjectViewIssueActions(); const globalIssueActions = useGlobalIssueActions(); const profileIssueActions = useProfileIssueActions(); const archivedIssueActions = useArchivedIssueActions(); const workspaceDraftIssueActions = useWorkspaceDraftIssueActions(); - const teamProjectWorkItemsActions = useTeamProjectWorkItemsActions(); switch (storeType) { - case EIssuesStoreType.TEAM_VIEW: - return teamViewIssueActions; case EIssuesStoreType.PROJECT_VIEW: return projectViewIssueActions; case EIssuesStoreType.PROFILE: return profileIssueActions; - case EIssuesStoreType.TEAM: - return teamIssueActions; case EIssuesStoreType.ARCHIVED: return archivedIssueActions; case EIssuesStoreType.CYCLE: @@ -85,8 +73,6 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => { return workspaceDraftIssueActions; case EIssuesStoreType.EPIC: return projectEpicsActions; - case EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS: - return teamProjectWorkItemsActions; case EIssuesStoreType.PROJECT: default: return projectIssueActions; diff --git a/apps/web/core/hooks/use-peek-overview-outside-click.tsx b/apps/web/core/hooks/use-peek-overview-outside-click.tsx index d8c1dd0eea..6fcf110280 100644 --- a/apps/web/core/hooks/use-peek-overview-outside-click.tsx +++ b/apps/web/core/hooks/use-peek-overview-outside-click.tsx @@ -10,7 +10,8 @@ import { useEffect, useCallback } from "react"; const usePeekOverviewOutsideClickDetector = ( ref: React.RefObject, callback: () => void, - issueId: string + issueId: string, + excludePreventionElementIds?: string[] ) => { const handleClick = useCallback( (event: MouseEvent) => { @@ -18,9 +19,18 @@ const usePeekOverviewOutsideClickDetector = ( if (ref.current && !ref.current.contains(event.target)) { // check for the closest element with attribute name data-prevent-outside-click const preventOutsideClickElement = event.target.closest("[data-prevent-outside-click]"); - // if the closest element with attribute name data-prevent-outside-click is found, return + // if the closest element with attribute name data-prevent-outside-click is found if (preventOutsideClickElement) { - return; + // Check if this element's ID is in the exclusion list + const elementId = preventOutsideClickElement.id; + const shouldExcludePrevention = + excludePreventionElementIds && elementId && excludePreventionElementIds.includes(elementId); + + if (!shouldExcludePrevention && !preventOutsideClickElement.contains(ref.current)) { + // Only prevent the callback if the ref is NOT inside the same prevent-outside-click container. + // This allows normal outside click detection for elements within the same container + return; + } } // check if the click target is the current issue element or its children let targetElement: HTMLElement | null = event.target; @@ -43,7 +53,7 @@ const usePeekOverviewOutsideClickDetector = ( callback(); } }, - [ref, callback, issueId] + [ref, callback, issueId, excludePreventionElementIds] ); useEffect(() => { diff --git a/apps/web/core/services/ai.service.ts b/apps/web/core/services/ai.service.ts index d76fdc6c6d..4c7612dfe6 100644 --- a/apps/web/core/services/ai.service.ts +++ b/apps/web/core/services/ai.service.ts @@ -7,7 +7,7 @@ // helpers import { API_BASE_URL } from "@plane/constants"; // plane web constants -import type { AI_EDITOR_TASKS } from "@/plane-web/constants/ai"; +import type { AI_EDITOR_TASKS } from "@/constants/ai"; // services import { APIService } from "@/services/api.service"; // types diff --git a/apps/web/ce/services/project/estimate.service.ts b/apps/web/core/services/estimate.service.ts similarity index 100% rename from apps/web/ce/services/project/estimate.service.ts rename to apps/web/core/services/estimate.service.ts diff --git a/apps/web/core/store/estimates/estimate-point.ts b/apps/web/core/store/estimates/estimate-point.ts index bb96c3ce3a..3671a02ca7 100644 --- a/apps/web/core/store/estimates/estimate-point.ts +++ b/apps/web/core/store/estimates/estimate-point.ts @@ -11,7 +11,7 @@ import { action, computed, makeObservable, observable, runInAction } from "mobx" // types import type { IEstimate, IEstimatePoint as IEstimatePointType } from "@plane/types"; // plane web services -import estimateService from "@/plane-web/services/project/estimate.service"; +import estimateService from "@/services/estimate.service"; // store import type { CoreRootStore } from "@/store/root.store"; diff --git a/apps/web/core/store/estimates/project-estimate.store.ts b/apps/web/core/store/estimates/project-estimate.store.ts index c48b04f93f..519e0805cf 100644 --- a/apps/web/core/store/estimates/project-estimate.store.ts +++ b/apps/web/core/store/estimates/project-estimate.store.ts @@ -10,7 +10,7 @@ import { computedFn } from "mobx-utils"; // types import type { IEstimate as IEstimateType, IEstimateFormData, TEstimateSystemKeys } from "@plane/types"; // plane web services -import estimateService from "@/plane-web/services/project/estimate.service"; +import estimateService from "@/services/estimate.service"; // plane web store import type { IEstimate } from "@/plane-web/store/estimates/estimate"; import { Estimate } from "@/plane-web/store/estimates/estimate"; diff --git a/apps/web/core/store/global-view.store.ts b/apps/web/core/store/global-view.store.ts index f5b0c12340..185604fa11 100644 --- a/apps/web/core/store/global-view.store.ts +++ b/apps/web/core/store/global-view.store.ts @@ -10,7 +10,7 @@ import { computedFn } from "mobx-utils"; // plane imports import type { IWorkspaceView } from "@plane/types"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // store import type { CoreRootStore } from "./root.store"; diff --git a/apps/web/core/store/issue/issue-details/relation.store.ts b/apps/web/core/store/issue/issue-details/relation.store.ts index d3f29ca94f..f03b73cf3a 100644 --- a/apps/web/core/store/issue/issue-details/relation.store.ts +++ b/apps/web/core/store/issue/issue-details/relation.store.ts @@ -12,7 +12,7 @@ import type { TIssueRelationIdMap, TIssueRelationMap, TIssueRelation, TIssue } f // components import type { TRelationObject } from "@/components/issues/issue-detail-widgets/relations"; // Plane-web -import { REVERSE_RELATIONS } from "@/plane-web/constants/gantt-chart"; +import { REVERSE_RELATIONS } from "@/constants/gantt-chart"; import type { TIssueRelationTypes } from "@/plane-web/types"; // services import { IssueRelationService } from "@/services/issue"; diff --git a/apps/web/core/store/issue/project-views/filter.store.ts b/apps/web/core/store/issue/project-views/filter.store.ts index c60ccca4dc..49c20d4111 100644 --- a/apps/web/core/store/issue/project-views/filter.store.ts +++ b/apps/web/core/store/issue/project-views/filter.store.ts @@ -24,7 +24,7 @@ import type { import { EIssuesStoreType } from "@plane/types"; import { handleIssueQueryParamsByLayout } from "@plane/utils"; // services -import { ViewService } from "@/plane-web/services"; +import { ViewService } from "@/services/view.service"; import type { IBaseIssueFilterStore } from "../helpers/issue-filter-helper.store"; import { IssueFilterHelperStore } from "../helpers/issue-filter-helper.store"; // helpers diff --git a/apps/web/core/store/issue/workspace/filter.store.ts b/apps/web/core/store/issue/workspace/filter.store.ts index bec673bd32..5b56a363b4 100644 --- a/apps/web/core/store/issue/workspace/filter.store.ts +++ b/apps/web/core/store/issue/workspace/filter.store.ts @@ -24,7 +24,7 @@ import type { import { EIssuesStoreType, EIssueLayoutTypes, STATIC_VIEW_TYPES } from "@plane/types"; import { handleIssueQueryParamsByLayout } from "@plane/utils"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // local imports import type { IBaseIssueFilterStore, IIssueFilterHelperStore } from "../helpers/issue-filter-helper.store"; import { IssueFilterHelperStore } from "../helpers/issue-filter-helper.store"; diff --git a/apps/web/core/store/issue/workspace/issue.store.ts b/apps/web/core/store/issue/workspace/issue.store.ts index 5bca1cbfdd..eea2333974 100644 --- a/apps/web/core/store/issue/workspace/issue.store.ts +++ b/apps/web/core/store/issue/workspace/issue.store.ts @@ -15,7 +15,7 @@ import type { ViewFlags, } from "@plane/types"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // types import type { IBaseIssuesStore } from "../helpers/base-issues.store"; import { BaseIssuesStore } from "../helpers/base-issues.store"; diff --git a/apps/web/core/store/member/workspace/workspace-member.store.ts b/apps/web/core/store/member/workspace/workspace-member.store.ts index 659569d88c..cad57f0aa2 100644 --- a/apps/web/core/store/member/workspace/workspace-member.store.ts +++ b/apps/web/core/store/member/workspace/workspace-member.store.ts @@ -12,7 +12,7 @@ import type { EUserPermissions } from "@plane/constants"; import type { IWorkspaceBulkInviteFormData, IWorkspaceMember, IWorkspaceMemberInvitation } from "@plane/types"; // plane-web constants // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // types import type { IRouterStore } from "@/store/router.store"; import type { IUserStore } from "@/store/user"; diff --git a/apps/web/core/store/project-view.store.ts b/apps/web/core/store/project-view.store.ts index cd7d2d9876..f4e4007a13 100644 --- a/apps/web/core/store/project-view.store.ts +++ b/apps/web/core/store/project-view.store.ts @@ -13,7 +13,7 @@ import type { IProjectView, TViewFilters } from "@plane/types"; // helpers import { getValidatedViewFilters, getViewName, orderViews, shouldFilterView } from "@plane/utils"; // services -import { ViewService } from "@/plane-web/services"; +import { ViewService } from "@/services/view.service"; // store import type { CoreRootStore } from "./root.store"; diff --git a/apps/web/core/store/state.store.ts b/apps/web/core/store/state.store.ts index fa2b773e7f..1e2ad56732 100644 --- a/apps/web/core/store/state.store.ts +++ b/apps/web/core/store/state.store.ts @@ -13,7 +13,7 @@ import type { IIntakeState, IState } from "@plane/types"; // helpers import { sortStates } from "@plane/utils"; // plane web -import { ProjectStateService } from "@/plane-web/services/project/project-state.service"; +import { ProjectStateService } from "@/services/project/project-state.service"; import type { RootStore } from "@/plane-web/store/root.store"; export interface IStateStore { diff --git a/apps/web/core/store/user/base-permissions.store.ts b/apps/web/core/store/user/base-permissions.store.ts index bcc1e02d3b..8810ab26cd 100644 --- a/apps/web/core/store/user/base-permissions.store.ts +++ b/apps/web/core/store/user/base-permissions.store.ts @@ -17,7 +17,7 @@ import { import type { EUserProjectRoles, IUserProjectsRole, IWorkspaceMemberMe, TProjectMembership } from "@plane/types"; import { EUserWorkspaceRoles } from "@plane/types"; // plane web imports -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; import type { RootStore } from "@/plane-web/store/root.store"; // services import projectMemberService from "@/services/project/project-member.service"; diff --git a/apps/web/core/store/workspace/home.ts b/apps/web/core/store/workspace/home.ts index ebe38f0259..de4099dd40 100644 --- a/apps/web/core/store/workspace/home.ts +++ b/apps/web/core/store/workspace/home.ts @@ -9,7 +9,7 @@ import { action, computed, makeObservable, observable, runInAction } from "mobx" // plane imports import type { THomeWidgetKeys, TWidgetEntityData } from "@plane/types"; // plane web services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // store import type { IWorkspaceLinkStore } from "./link.store"; import { WorkspaceLinkStore } from "./link.store"; diff --git a/apps/web/core/store/workspace/index.ts b/apps/web/core/store/workspace/index.ts index a74f088a98..746c869991 100644 --- a/apps/web/core/store/workspace/index.ts +++ b/apps/web/core/store/workspace/index.ts @@ -15,7 +15,7 @@ import type { IWorkspaceUserPropertiesResponse, } from "@plane/types"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; // store import type { CoreRootStore } from "@/store/root.store"; // sub-stores diff --git a/apps/web/core/store/workspace/link.store.ts b/apps/web/core/store/workspace/link.store.ts index e5eeadd73e..3b6ead0d25 100644 --- a/apps/web/core/store/workspace/link.store.ts +++ b/apps/web/core/store/workspace/link.store.ts @@ -9,7 +9,7 @@ import { action, makeObservable, observable, runInAction } from "mobx"; // types import type { TLink, TLinkIdMap, TLinkMap } from "@plane/types"; // services -import { WorkspaceService } from "@/plane-web/services"; +import { WorkspaceService } from "@/services/workspace.service"; export interface IWorkspaceLinkStoreActions { addLinks: (projectId: string, links: TLink[]) => void; diff --git a/apps/web/ee/components/active-cycles/index.ts b/apps/web/ee/components/active-cycles/index.ts deleted file mode 100644 index aff0690a0b..0000000000 --- a/apps/web/ee/components/active-cycles/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./root"; -export * from "./workspace-active-cycles-upgrade"; diff --git a/apps/web/ee/components/active-cycles/root.tsx b/apps/web/ee/components/active-cycles/root.tsx deleted file mode 100644 index 4b53728fad..0000000000 --- a/apps/web/ee/components/active-cycles/root.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/active-cycles/root"; diff --git a/apps/web/ee/components/active-cycles/workspace-active-cycles-upgrade.tsx b/apps/web/ee/components/active-cycles/workspace-active-cycles-upgrade.tsx deleted file mode 100644 index 49fe48943e..0000000000 --- a/apps/web/ee/components/active-cycles/workspace-active-cycles-upgrade.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/active-cycles/workspace-active-cycles-upgrade"; diff --git a/apps/web/ee/components/app-rail/index.ts b/apps/web/ee/components/app-rail/index.ts deleted file mode 100644 index df5c680635..0000000000 --- a/apps/web/ee/components/app-rail/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/app-rail"; diff --git a/apps/web/ee/components/comments/index.ts b/apps/web/ee/components/comments/index.ts deleted file mode 100644 index c447172cfd..0000000000 --- a/apps/web/ee/components/comments/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/comments"; diff --git a/apps/web/ee/components/common/extended-app-header.tsx b/apps/web/ee/components/common/extended-app-header.tsx deleted file mode 100644 index fc2260055c..0000000000 --- a/apps/web/ee/components/common/extended-app-header.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/common/extended-app-header"; diff --git a/apps/web/ee/components/common/index.ts b/apps/web/ee/components/common/index.ts deleted file mode 100644 index 94a605e38b..0000000000 --- a/apps/web/ee/components/common/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./extended-app-header"; diff --git a/apps/web/ee/components/cycles/active-cycle/index.ts b/apps/web/ee/components/cycles/active-cycle/index.ts deleted file mode 100644 index 9e9af3eb05..0000000000 --- a/apps/web/ee/components/cycles/active-cycle/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/cycles/active-cycle"; diff --git a/apps/web/ee/components/cycles/analytics-sidebar/index.ts b/apps/web/ee/components/cycles/analytics-sidebar/index.ts deleted file mode 100644 index 28d3f5bac6..0000000000 --- a/apps/web/ee/components/cycles/analytics-sidebar/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/cycles/analytics-sidebar"; diff --git a/apps/web/ee/components/cycles/end-cycle/index.ts b/apps/web/ee/components/cycles/end-cycle/index.ts deleted file mode 100644 index c77fdb0baf..0000000000 --- a/apps/web/ee/components/cycles/end-cycle/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/cycles/end-cycle"; diff --git a/apps/web/ee/components/cycles/index.ts b/apps/web/ee/components/cycles/index.ts deleted file mode 100644 index 07ff197d32..0000000000 --- a/apps/web/ee/components/cycles/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./active-cycle"; -export * from "./analytics-sidebar"; -export * from "./end-cycle"; -export * from "ce/components/cycles/additional-actions"; diff --git a/apps/web/ee/components/estimates/estimate-list-item-buttons.tsx b/apps/web/ee/components/estimates/estimate-list-item-buttons.tsx deleted file mode 100644 index 68caf05637..0000000000 --- a/apps/web/ee/components/estimates/estimate-list-item-buttons.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/estimates/estimate-list-item-buttons"; diff --git a/apps/web/ee/components/estimates/index.ts b/apps/web/ee/components/estimates/index.ts deleted file mode 100644 index f48ec6b889..0000000000 --- a/apps/web/ee/components/estimates/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./estimate-list-item-buttons"; -export * from "./update"; -export * from "./points"; diff --git a/apps/web/ee/components/estimates/points/delete.tsx b/apps/web/ee/components/estimates/points/delete.tsx deleted file mode 100644 index c6bf09416a..0000000000 --- a/apps/web/ee/components/estimates/points/delete.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/estimates/points/delete"; diff --git a/apps/web/ee/components/estimates/points/index.ts b/apps/web/ee/components/estimates/points/index.ts deleted file mode 100644 index c83c4600f4..0000000000 --- a/apps/web/ee/components/estimates/points/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./delete"; diff --git a/apps/web/ee/components/estimates/update/index.ts b/apps/web/ee/components/estimates/update/index.ts deleted file mode 100644 index dd65a9ec34..0000000000 --- a/apps/web/ee/components/estimates/update/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./modal"; diff --git a/apps/web/ee/components/estimates/update/modal.tsx b/apps/web/ee/components/estimates/update/modal.tsx deleted file mode 100644 index 8f1f8d8f1c..0000000000 --- a/apps/web/ee/components/estimates/update/modal.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/estimates/update/modal"; diff --git a/apps/web/ee/components/gantt-chart/blocks/block-row-list.tsx b/apps/web/ee/components/gantt-chart/blocks/block-row-list.tsx deleted file mode 100644 index 76cea099b4..0000000000 --- a/apps/web/ee/components/gantt-chart/blocks/block-row-list.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/gantt-chart/blocks/block-row-list"; diff --git a/apps/web/ee/components/gantt-chart/blocks/blocks-list.tsx b/apps/web/ee/components/gantt-chart/blocks/blocks-list.tsx deleted file mode 100644 index 8a607663ca..0000000000 --- a/apps/web/ee/components/gantt-chart/blocks/blocks-list.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/gantt-chart/blocks/blocks-list"; diff --git a/apps/web/ee/components/gantt-chart/index.ts b/apps/web/ee/components/gantt-chart/index.ts deleted file mode 100644 index fb6a04144a..0000000000 --- a/apps/web/ee/components/gantt-chart/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/gantt-chart"; diff --git a/apps/web/ee/components/global/index.ts b/apps/web/ee/components/global/index.ts deleted file mode 100644 index 6947f1fd0d..0000000000 --- a/apps/web/ee/components/global/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/global"; diff --git a/apps/web/ee/components/home/header.tsx b/apps/web/ee/components/home/header.tsx deleted file mode 100644 index 5fab957355..0000000000 --- a/apps/web/ee/components/home/header.tsx +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export function HomePageHeader() { - return <>; -} diff --git a/apps/web/ee/components/home/index.ts b/apps/web/ee/components/home/index.ts deleted file mode 100644 index 1f03dabb1e..0000000000 --- a/apps/web/ee/components/home/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/home"; diff --git a/apps/web/ee/components/inbox/source-pill.tsx b/apps/web/ee/components/inbox/source-pill.tsx deleted file mode 100644 index d9107571e8..0000000000 --- a/apps/web/ee/components/inbox/source-pill.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/inbox/source-pill"; diff --git a/apps/web/ee/components/instance/index.ts b/apps/web/ee/components/instance/index.ts deleted file mode 100644 index 3950e96872..0000000000 --- a/apps/web/ee/components/instance/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/instance"; diff --git a/apps/web/ee/components/instance/maintenance-message.tsx b/apps/web/ee/components/instance/maintenance-message.tsx deleted file mode 100644 index 5b67e13dfc..0000000000 --- a/apps/web/ee/components/instance/maintenance-message.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/instance/maintenance-message"; diff --git a/apps/web/ee/components/issues/issue-details/sidebar/transfer-hop-info.tsx b/apps/web/ee/components/issues/issue-details/sidebar/transfer-hop-info.tsx deleted file mode 100644 index 0373b5075c..0000000000 --- a/apps/web/ee/components/issues/issue-details/sidebar/transfer-hop-info.tsx +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - diff --git a/apps/web/ee/components/navigations/index.ts b/apps/web/ee/components/navigations/index.ts deleted file mode 100644 index e7d49af842..0000000000 --- a/apps/web/ee/components/navigations/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/navigations"; diff --git a/apps/web/ee/components/pages/index.ts b/apps/web/ee/components/pages/index.ts deleted file mode 100644 index 13c68e0762..0000000000 --- a/apps/web/ee/components/pages/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/pages"; diff --git a/apps/web/ee/components/projects/create/attributes.tsx b/apps/web/ee/components/projects/create/attributes.tsx deleted file mode 100644 index 03bd73819b..0000000000 --- a/apps/web/ee/components/projects/create/attributes.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/create/attributes"; diff --git a/apps/web/ee/components/projects/create/root.tsx b/apps/web/ee/components/projects/create/root.tsx deleted file mode 100644 index 32490e4d04..0000000000 --- a/apps/web/ee/components/projects/create/root.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/create/root"; diff --git a/apps/web/ee/components/projects/header.tsx b/apps/web/ee/components/projects/header.tsx deleted file mode 100644 index dc6f0882d8..0000000000 --- a/apps/web/ee/components/projects/header.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/header"; diff --git a/apps/web/ee/components/projects/mobile-header.tsx b/apps/web/ee/components/projects/mobile-header.tsx deleted file mode 100644 index 8627826320..0000000000 --- a/apps/web/ee/components/projects/mobile-header.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/mobile-header"; diff --git a/apps/web/ee/components/projects/page.tsx b/apps/web/ee/components/projects/page.tsx deleted file mode 100644 index 1e5a6e6e6e..0000000000 --- a/apps/web/ee/components/projects/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/page"; diff --git a/apps/web/ee/components/projects/settings/features-list.tsx b/apps/web/ee/components/projects/settings/features-list.tsx deleted file mode 100644 index f256288ae1..0000000000 --- a/apps/web/ee/components/projects/settings/features-list.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export { ProjectFeaturesList } from "@/components/project/settings/features-list"; diff --git a/apps/web/ee/components/projects/settings/useProjectColumns.tsx b/apps/web/ee/components/projects/settings/useProjectColumns.tsx deleted file mode 100644 index c697d0d245..0000000000 --- a/apps/web/ee/components/projects/settings/useProjectColumns.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/projects/settings/useProjectColumns"; diff --git a/apps/web/ee/components/relations/index.tsx b/apps/web/ee/components/relations/index.tsx deleted file mode 100644 index 7c548c6e8a..0000000000 --- a/apps/web/ee/components/relations/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/relations"; diff --git a/apps/web/ee/components/sidebar/index.ts b/apps/web/ee/components/sidebar/index.ts deleted file mode 100644 index 445e539a5c..0000000000 --- a/apps/web/ee/components/sidebar/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/sidebar"; diff --git a/apps/web/ee/components/views/access-controller.tsx b/apps/web/ee/components/views/access-controller.tsx deleted file mode 100644 index b2392811df..0000000000 --- a/apps/web/ee/components/views/access-controller.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/views/access-controller"; diff --git a/apps/web/ee/components/views/filters/access-filter.tsx b/apps/web/ee/components/views/filters/access-filter.tsx deleted file mode 100644 index 2a71d7d530..0000000000 --- a/apps/web/ee/components/views/filters/access-filter.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/views/filters/access-filter"; diff --git a/apps/web/ee/components/views/publish/index.ts b/apps/web/ee/components/views/publish/index.ts deleted file mode 100644 index 96fa5973dc..0000000000 --- a/apps/web/ee/components/views/publish/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/views/publish"; diff --git a/apps/web/ee/components/workflow/index.ts b/apps/web/ee/components/workflow/index.ts deleted file mode 100644 index c7526fcf75..0000000000 --- a/apps/web/ee/components/workflow/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/components/workflow"; diff --git a/apps/web/ee/constants/index.ts b/apps/web/ee/constants/index.ts deleted file mode 100644 index 4d836788db..0000000000 --- a/apps/web/ee/constants/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./sidebar-favorites"; diff --git a/apps/web/ee/constants/project/index.ts b/apps/web/ee/constants/project/index.ts deleted file mode 100644 index 5b516d9036..0000000000 --- a/apps/web/ee/constants/project/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./settings"; diff --git a/apps/web/ee/constants/project/settings/features.tsx b/apps/web/ee/constants/project/settings/features.tsx deleted file mode 100644 index 83c8b0f8ee..0000000000 --- a/apps/web/ee/constants/project/settings/features.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/constants/project/settings/features"; diff --git a/apps/web/ee/constants/project/settings/index.ts b/apps/web/ee/constants/project/settings/index.ts deleted file mode 100644 index e9201fe43a..0000000000 --- a/apps/web/ee/constants/project/settings/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./features"; diff --git a/apps/web/ee/constants/sidebar-favorites.ts b/apps/web/ee/constants/sidebar-favorites.ts deleted file mode 100644 index 8d96327cee..0000000000 --- a/apps/web/ee/constants/sidebar-favorites.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/constants/sidebar-favorites"; diff --git a/apps/web/ee/helpers/command-palette.ts b/apps/web/ee/helpers/command-palette.ts deleted file mode 100644 index 4e0046006f..0000000000 --- a/apps/web/ee/helpers/command-palette.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/command-palette"; diff --git a/apps/web/ee/helpers/epic-analytics.ts b/apps/web/ee/helpers/epic-analytics.ts deleted file mode 100644 index d26658642c..0000000000 --- a/apps/web/ee/helpers/epic-analytics.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/epic-analytics"; diff --git a/apps/web/ee/helpers/instance.helper.ts b/apps/web/ee/helpers/instance.helper.ts deleted file mode 100644 index cde7a48c70..0000000000 --- a/apps/web/ee/helpers/instance.helper.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/instance.helper"; diff --git a/apps/web/ee/helpers/issue-action-helper.ts b/apps/web/ee/helpers/issue-action-helper.ts deleted file mode 100644 index c9cd8961ea..0000000000 --- a/apps/web/ee/helpers/issue-action-helper.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/issue-action-helper"; diff --git a/apps/web/ee/helpers/issue-filter.helper.ts b/apps/web/ee/helpers/issue-filter.helper.ts deleted file mode 100644 index 9df1a48bd3..0000000000 --- a/apps/web/ee/helpers/issue-filter.helper.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/issue-filter.helper"; diff --git a/apps/web/ee/helpers/project-settings.ts b/apps/web/ee/helpers/project-settings.ts deleted file mode 100644 index 6f04316446..0000000000 --- a/apps/web/ee/helpers/project-settings.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/project-settings"; diff --git a/apps/web/ee/helpers/workspace.helper.ts b/apps/web/ee/helpers/workspace.helper.ts deleted file mode 100644 index 75bab54595..0000000000 --- a/apps/web/ee/helpers/workspace.helper.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/helpers/workspace.helper"; diff --git a/apps/web/ee/hooks/app-rail/index.ts b/apps/web/ee/hooks/app-rail/index.ts deleted file mode 100644 index 6e07a2d6ea..0000000000 --- a/apps/web/ee/hooks/app-rail/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/app-rail"; diff --git a/apps/web/ee/hooks/store/index.ts b/apps/web/ee/hooks/store/index.ts deleted file mode 100644 index 093d52e46a..0000000000 --- a/apps/web/ee/hooks/store/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/store"; diff --git a/apps/web/ee/hooks/use-additional-editor-mention.tsx b/apps/web/ee/hooks/use-additional-editor-mention.tsx deleted file mode 100644 index fc54bff522..0000000000 --- a/apps/web/ee/hooks/use-additional-editor-mention.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "@/plane-web/hooks/use-additional-editor-mention"; diff --git a/apps/web/ee/hooks/use-additional-favorite-item-details.ts b/apps/web/ee/hooks/use-additional-favorite-item-details.ts deleted file mode 100644 index d7a890b070..0000000000 --- a/apps/web/ee/hooks/use-additional-favorite-item-details.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-additional-favorite-item-details"; diff --git a/apps/web/ee/hooks/use-editor-flagging.ts b/apps/web/ee/hooks/use-editor-flagging.ts deleted file mode 100644 index b2e5e66b54..0000000000 --- a/apps/web/ee/hooks/use-editor-flagging.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-editor-flagging"; diff --git a/apps/web/ee/hooks/use-file-size.ts b/apps/web/ee/hooks/use-file-size.ts deleted file mode 100644 index 2aa1a2ea1a..0000000000 --- a/apps/web/ee/hooks/use-file-size.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-file-size"; diff --git a/apps/web/ee/hooks/use-issue-embed.tsx b/apps/web/ee/hooks/use-issue-embed.tsx deleted file mode 100644 index 0ce96673ab..0000000000 --- a/apps/web/ee/hooks/use-issue-embed.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-issue-embed"; diff --git a/apps/web/ee/hooks/use-issue-properties.tsx b/apps/web/ee/hooks/use-issue-properties.tsx deleted file mode 100644 index 3654ab4333..0000000000 --- a/apps/web/ee/hooks/use-issue-properties.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-issue-properties"; diff --git a/apps/web/ee/hooks/use-page-flag.ts b/apps/web/ee/hooks/use-page-flag.ts deleted file mode 100644 index b54821dff3..0000000000 --- a/apps/web/ee/hooks/use-page-flag.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/hooks/use-page-flag"; diff --git a/apps/web/ee/hooks/use-timeline-chart.ts b/apps/web/ee/hooks/use-timeline-chart.ts deleted file mode 100644 index f03866680a..0000000000 --- a/apps/web/ee/hooks/use-timeline-chart.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -// For now, just re-export from CE -// In the future, you can extend the timeline store mapping here for EE-specific timeline types -export * from "ce/hooks/use-timeline-chart"; diff --git a/apps/web/ee/layouts/project-wrapper.tsx b/apps/web/ee/layouts/project-wrapper.tsx deleted file mode 100644 index 4346d50ddc..0000000000 --- a/apps/web/ee/layouts/project-wrapper.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/layouts/project-wrapper"; diff --git a/apps/web/ee/layouts/workspace-wrapper.tsx b/apps/web/ee/layouts/workspace-wrapper.tsx deleted file mode 100644 index 28995114ff..0000000000 --- a/apps/web/ee/layouts/workspace-wrapper.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/layouts/workspace-wrapper"; diff --git a/apps/web/ee/services/index.ts b/apps/web/ee/services/index.ts deleted file mode 100644 index 998e3e9a46..0000000000 --- a/apps/web/ee/services/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./project"; -export * from "@/services/workspace.service"; diff --git a/apps/web/ee/services/project/estimate.service.ts b/apps/web/ee/services/project/estimate.service.ts deleted file mode 100644 index 6bc359fc7d..0000000000 --- a/apps/web/ee/services/project/estimate.service.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/services/project/estimate.service"; diff --git a/apps/web/ee/services/project/index.ts b/apps/web/ee/services/project/index.ts deleted file mode 100644 index 99d3ebcb90..0000000000 --- a/apps/web/ee/services/project/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./estimate.service"; diff --git a/apps/web/ee/services/project/project-state.service.ts b/apps/web/ee/services/project/project-state.service.ts deleted file mode 100644 index 74aa51083c..0000000000 --- a/apps/web/ee/services/project/project-state.service.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "@/services/project/project-state.service"; diff --git a/apps/web/ee/store/analytics.store.ts b/apps/web/ee/store/analytics.store.ts deleted file mode 100644 index 9ae14f9b65..0000000000 --- a/apps/web/ee/store/analytics.store.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import type { IBaseAnalyticsStore } from "@/store/analytics.store"; -import { BaseAnalyticsStore } from "@/store/analytics.store"; - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface IAnalyticsStore extends IBaseAnalyticsStore { - //observables -} - -export class AnalyticsStore extends BaseAnalyticsStore {} diff --git a/apps/web/ee/store/command-palette.store.ts b/apps/web/ee/store/command-palette.store.ts deleted file mode 100644 index 472663f9b2..0000000000 --- a/apps/web/ee/store/command-palette.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/command-palette.store"; diff --git a/apps/web/ee/store/cycle/index.ts b/apps/web/ee/store/cycle/index.ts deleted file mode 100644 index 73f6ed4e83..0000000000 --- a/apps/web/ee/store/cycle/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "@/store/cycle.store"; diff --git a/apps/web/ee/store/estimates/estimate.ts b/apps/web/ee/store/estimates/estimate.ts deleted file mode 100644 index 0ca3a5bf97..0000000000 --- a/apps/web/ee/store/estimates/estimate.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/estimates/estimate"; diff --git a/apps/web/ee/store/issue/helpers/base-issue.store.ts b/apps/web/ee/store/issue/helpers/base-issue.store.ts deleted file mode 100644 index ef05c29f92..0000000000 --- a/apps/web/ee/store/issue/helpers/base-issue.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/issue/helpers/base-issue.store"; diff --git a/apps/web/ee/store/issue/issue-details/activity.store.ts b/apps/web/ee/store/issue/issue-details/activity.store.ts deleted file mode 100644 index 4b2417cd79..0000000000 --- a/apps/web/ee/store/issue/issue-details/activity.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/issue/issue-details/activity.store"; diff --git a/apps/web/ee/store/issue/issue-details/root.store.ts b/apps/web/ee/store/issue/issue-details/root.store.ts deleted file mode 100644 index 9cbc67182e..0000000000 --- a/apps/web/ee/store/issue/issue-details/root.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/issue/issue-details/root.store"; diff --git a/apps/web/ee/store/issue/team-views/index.ts b/apps/web/ee/store/issue/team-views/index.ts deleted file mode 100644 index aaf0a16677..0000000000 --- a/apps/web/ee/store/issue/team-views/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/issue/team-views"; diff --git a/apps/web/ee/store/issue/team/index.ts b/apps/web/ee/store/issue/team/index.ts deleted file mode 100644 index d9c857b5b3..0000000000 --- a/apps/web/ee/store/issue/team/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/issue/team"; diff --git a/apps/web/ee/store/member/project-member.store.ts b/apps/web/ee/store/member/project-member.store.ts deleted file mode 100644 index 5cae0613dd..0000000000 --- a/apps/web/ee/store/member/project-member.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/member/project-member.store"; diff --git a/apps/web/ee/store/project-inbox.store.ts b/apps/web/ee/store/project-inbox.store.ts deleted file mode 100644 index abe7af3e9d..0000000000 --- a/apps/web/ee/store/project-inbox.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/project-inbox.store"; diff --git a/apps/web/ee/store/root.store.ts b/apps/web/ee/store/root.store.ts deleted file mode 100644 index 0f36aac3dd..0000000000 --- a/apps/web/ee/store/root.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/root.store"; diff --git a/apps/web/ee/store/state.store.ts b/apps/web/ee/store/state.store.ts deleted file mode 100644 index b27221268a..0000000000 --- a/apps/web/ee/store/state.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "@/store/state.store"; diff --git a/apps/web/ee/store/timeline/base-timeline.store.ts b/apps/web/ee/store/timeline/base-timeline.store.ts deleted file mode 100644 index 58d323b8da..0000000000 --- a/apps/web/ee/store/timeline/base-timeline.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/timeline/base-timeline.store"; diff --git a/apps/web/ee/store/user/permission.store.ts b/apps/web/ee/store/user/permission.store.ts deleted file mode 100644 index 16e54bd9e8..0000000000 --- a/apps/web/ee/store/user/permission.store.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/store/user/permission.store"; diff --git a/apps/web/ee/types/index.ts b/apps/web/ee/types/index.ts deleted file mode 100644 index 969da5d1fb..0000000000 --- a/apps/web/ee/types/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./projects"; -export * from "./issue-types"; diff --git a/apps/web/ee/types/issue-types/index.ts b/apps/web/ee/types/issue-types/index.ts deleted file mode 100644 index 8406674ae0..0000000000 --- a/apps/web/ee/types/issue-types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./issue-property-values.d"; diff --git a/apps/web/ee/types/issue-types/issue-property-values.d.ts b/apps/web/ee/types/issue-types/issue-property-values.d.ts deleted file mode 100644 index 9aac710889..0000000000 --- a/apps/web/ee/types/issue-types/issue-property-values.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/types/issue-types/issue-property-values.d"; diff --git a/apps/web/ee/types/projects/index.ts b/apps/web/ee/types/projects/index.ts deleted file mode 100644 index 50822d864c..0000000000 --- a/apps/web/ee/types/projects/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "./projects"; diff --git a/apps/web/ee/types/projects/projects.ts b/apps/web/ee/types/projects/projects.ts deleted file mode 100644 index 59aa09b93f..0000000000 --- a/apps/web/ee/types/projects/projects.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -export * from "ce/types/projects/projects"; diff --git a/apps/web/ce/helpers/issue-filter.helper.ts b/apps/web/helpers/issue-filter.helper.ts similarity index 61% rename from apps/web/ce/helpers/issue-filter.helper.ts rename to apps/web/helpers/issue-filter.helper.ts index 5ca0d75b61..7e2fff4f7a 100644 --- a/apps/web/ce/helpers/issue-filter.helper.ts +++ b/apps/web/helpers/issue-filter.helper.ts @@ -9,22 +9,6 @@ import type { IIssueDisplayProperties } from "@plane/types"; // lib import { store } from "@/lib/store-context"; -export type TShouldRenderDisplayProperty = { - workspaceSlug: string; - projectId: string | undefined; - key: keyof IIssueDisplayProperties; -}; - -export const shouldRenderDisplayProperty = (props: TShouldRenderDisplayProperty) => { - const { key } = props; - switch (key) { - case "issue_type": - return false; - default: - return true; - } -}; - export const shouldRenderColumn = (key: keyof IIssueDisplayProperties): boolean => { const isEstimateEnabled: boolean = store.projectRoot.project.currentProjectDetails?.estimate !== null; switch (key) { diff --git a/apps/web/helpers/views.helper.ts b/apps/web/helpers/views.helper.ts index 3973472b95..5b91810c9b 100644 --- a/apps/web/helpers/views.helper.ts +++ b/apps/web/helpers/views.helper.ts @@ -15,6 +15,7 @@ const VIEW_ACCESS_ICONS = { [EViewAccess.PUBLIC]: GlobeIcon, [EViewAccess.PRIVATE]: LockIcon, }; + export const VIEW_ACCESS_SPECIFIERS: { key: EViewAccess; i18n_label: string; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 3084e156b4..2646a6599f 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -5,11 +5,9 @@ "@/*": ["./core/*"], "@/app/*": ["./app/*"], "@/helpers/*": ["./helpers/*"], - "@/plane-web/*": ["./ce/*"], "@/styles/*": ["./styles/*"], - "app/*": ["./app/*"], - "package.json": ["./package.json"], - "ce/*": ["./ce/*"] + "@/plane-web/*": ["./ce/*"], + "package.json": ["./package.json"] }, "strictNullChecks": true, "exactOptionalPropertyTypes": false, diff --git a/deployments/cli/community/install.sh b/deployments/cli/community/install.sh index c26fba22b8..582aa83941 100755 --- a/deployments/cli/community/install.sh +++ b/deployments/cli/community/install.sh @@ -23,16 +23,16 @@ function print_header() { clear cat <<"EOF" --------------------------------------------- - ____ _ ///////// -| _ \| | __ _ _ __ ___ ///////// -| |_) | |/ _` | '_ \ / _ \ ///// ///// -| __/| | (_| | | | | __/ ///// ///// -|_| |_|\__,_|_| |_|\___| //// - //// --------------------------------------------- -Project management tool from the future --------------------------------------------- +##+. ##+ .##- + ######+.######-.######. + #######. -### +#####+. + #######. + +######. + #######. .####### + #######. .####### + ####### + .####### + .+#####+ ###- .####### + .######.-#####+.+###### + -##. -## .+## EOF } diff --git a/package.json b/package.json index 366ecd064b..608da162f3 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,12 @@ "@types/express": "4.17.23", "typescript": "catalog:", "vite": "catalog:", - "qs": "6.14.1" + "qs": "6.14.2", + "diff": "5.2.2", + "webpack": "5.104.1", + "lodash-es": "catalog:", + "@isaacs/brace-expansion": "5.0.1", + "lodash": "4.17.23" }, "onlyBuiltDependencies": [ "@sentry/cli", diff --git a/packages/constants/src/issue/common.ts b/packages/constants/src/issue/common.ts index 1edf582fd4..fe56c44f81 100644 --- a/packages/constants/src/issue/common.ts +++ b/packages/constants/src/issue/common.ts @@ -175,10 +175,6 @@ export const ISSUE_DISPLAY_PROPERTIES: { key: "key", titleTranslationKey: "issue.display.properties.id", }, - { - key: "issue_type", - titleTranslationKey: "issue.display.properties.issue_type", - }, { key: "assignee", titleTranslationKey: "common.assignee", diff --git a/packages/i18n/src/locales/ru/translations.ts b/packages/i18n/src/locales/ru/translations.ts index 317093e4e3..3952883d6c 100644 --- a/packages/i18n/src/locales/ru/translations.ts +++ b/packages/i18n/src/locales/ru/translations.ts @@ -221,6 +221,8 @@ export default { security: "Безопасность", activity: "Активность", appearance: "Внешний вид", + preferences: "Настройки", + language_and_time: "Язык и время", notifications: "Уведомления", workspaces: "Рабочие пространства", create_workspace: "Создать рабочее пространство", @@ -233,6 +235,10 @@ export default { something_went_wrong_please_try_again: "Что-то пошло не так. Пожалуйста, попробуйте еще раз.", load_more: "Загрузить еще", select_or_customize_your_interface_color_scheme: "Выберите или настройте цветовую схему интерфейса.", + timezone_setting: "Текущий часовой пояс.", + language_setting: "Выберите язык интерфейса.", + settings_moved_to_preferences: "Настройки часового пояса и языка перемещены в раздел предпочтений.", + go_to_preferences: "Перейти к предпочтениям", theme: "Тема", system_preference: "Системные настройки", light: "Светлая", @@ -528,6 +534,9 @@ export default { new_password_must_be_different_from_old_password: "Новое пароль должен отличаться от старого пароля", edited: "Редактировано", bot: "Бот", + settings_description: + "Управляйте настройками аккаунта, рабочего пространства и проекта в одном месте. Переключайтесь между вкладками для настройки.", + back_to_workspace: "Вернуться в рабочее пространство", project_view: { sort_by: { created_at: "Дата создания", @@ -822,6 +831,7 @@ export default { show_weekends: "Показывать выходные", enable: "Включить", disable: "Отключить", + copy_markdown: "Копировать markdown", }, name: "Название", discard: "Отменить", @@ -912,6 +922,7 @@ export default { paused: "На паузе", no_of: "Количество {entity}", resolved: "Решено", + overview: "Обзор", }, chart: { x_axis: "Ось X", @@ -1573,6 +1584,25 @@ export default { }, }, }, + preferences: { + heading: "Предпочтения", + description: "Настройте приложение под свой стиль работы", + }, + notifications: { + heading: "Email-уведомления", + description: "Будьте в курсе рабочих элементов, на которые вы подписаны. Включите уведомления.", + }, + security: { + heading: "Безопасность", + }, + api_tokens: { + heading: "Персональные токены доступа", + description: "Создавайте защищённые API-токены для интеграции данных с внешними системами и приложениями.", + }, + activity: { + heading: "Активность", + description: "Отслеживайте последние действия и изменения во всех проектах и рабочих элементах.", + }, }, workspace_settings: { label: "Настройки пространства", @@ -1642,14 +1672,20 @@ export default { }, }, billing_and_plans: { + heading: "Оплата и тарифы", + description: "Выберите тариф, управляйте подписками и легко обновляйте их по мере роста потребностей.", title: "Оплата и тарифы", current_plan: "Текущий тариф", free_plan: "Используется бесплатный тариф", view_plans: "Посмотреть тарифы", }, exports: { + heading: "Экспорт", + description: "Экспортируйте данные проекта в различных форматах и просматривайте историю экспортов.", title: "Экспорт", exporting: "Экспортируется", + exporting_projects: "Экспорт проекта", + format: "Формат", previous_exports: "Предыдущие экспорты", export_separate_files: "Экспорт в отдельные файлы", filters_info: "Примените фильтры для экспорта конкретных рабочих элементов по вашим критериям.", @@ -1668,6 +1704,8 @@ export default { }, }, webhooks: { + heading: "Вебхуки", + description: "Автоматизируйте уведомления во внешние сервисы при событиях проекта.", title: "Вебхуки", add_webhook: "Добавить вебхук", modal: { @@ -1791,8 +1829,9 @@ export default { profile: "Профиль", security: "Безопасность", activity: "Активность", - appearance: "Внешний вид", + preferences: "Предпочтения", notifications: "Уведомления", + "api-tokens": "Персональные токены доступа", }, tabs: { summary: "Сводка", @@ -1856,6 +1895,8 @@ export default { }, }, states: { + heading: "Статусы", + description: "Определяйте и настраивайте статусы рабочего процесса для отслеживания прогресса рабочих элементов.", describe_this_state_for_your_members: "Опишите этот статус для участников", empty_state: { title: "Нет статусов для группы {groupKey}", @@ -1863,6 +1904,8 @@ export default { }, }, labels: { + heading: "Метки", + description: "Создавайте пользовательские метки для категоризации и организации рабочих элементов.", label_title: "Название метки", label_title_is_required: "Название обязательно", label_max_char: "Максимальная длина названия - 255 символов", @@ -1871,9 +1914,11 @@ export default { }, }, estimates: { + heading: "Оценки", + description: "Настройте системы оценок для отслеживания и коммуникации трудозатрат по каждому рабочему элементу.", label: "Оценки", title: "Включить оценки для моего проекта", - description: "Они помогают вам в общении о сложности и рабочей нагрузке команды.", + enable_description: "Они помогают вам в общении о сложности и рабочей нагрузке команды.", no_estimate: "Без оценки", new: "Новая система оценок", create: { @@ -1956,6 +2001,9 @@ export default { }, automations: { label: "Автоматизация", + heading: "Автоматизация", + description: + "Настройте автоматические действия для оптимизации рабочего процесса и сокращения ручных задач.", "auto-archive": { title: "Автоархивация закрытых рабочих элементов", description: "Plane будет автоматически архивировать рабочие элементы, которые были завершены или отменены.", @@ -2676,4 +2724,205 @@ export default { close_button: "Закрыть панель навигации", outline_floating_button: "Открыть структуру", }, + project_members: { + full_name: "Полное имя", + display_name: "Отображаемое имя", + email: "Email", + joining_date: "Дата присоединения", + role: "Роль", + }, + power_k: { + contextual_actions: { + work_item: { + title: "Действия с рабочим элементом", + indicator: "Рабочий элемент", + change_state: "Изменить статус", + change_priority: "Изменить приоритет", + change_assignees: "Назначить", + assign_to_me: "Назначить себе", + unassign_from_me: "Снять с себя", + change_estimate: "Изменить оценку", + add_to_cycle: "Добавить в цикл", + add_to_modules: "Добавить в модули", + add_labels: "Добавить метки", + subscribe: "Подписаться на уведомления", + unsubscribe: "Отписаться от уведомлений", + delete: "Удалить", + copy_id: "Копировать ID", + copy_id_toast_success: "ID рабочего элемента скопирован в буфер.", + copy_id_toast_error: "Ошибка при копировании ID рабочего элемента.", + copy_title: "Копировать название", + copy_title_toast_success: "Название рабочего элемента скопировано в буфер.", + copy_title_toast_error: "Ошибка при копировании названия рабочего элемента.", + copy_url: "Копировать URL", + copy_url_toast_success: "URL рабочего элемента скопирован в буфер.", + copy_url_toast_error: "Ошибка при копировании URL рабочего элемента.", + }, + cycle: { + title: "Действия с циклом", + indicator: "Цикл", + add_to_favorites: "Добавить в избранное", + remove_from_favorites: "Удалить из избранного", + copy_url: "Копировать URL", + copy_url_toast_success: "URL цикла скопирован в буфер.", + copy_url_toast_error: "Ошибка при копировании URL цикла.", + }, + module: { + title: "Действия с модулем", + indicator: "Модуль", + add_remove_members: "Добавить/удалить участников", + change_status: "Изменить статус", + add_to_favorites: "Добавить в избранное", + remove_from_favorites: "Удалить из избранного", + copy_url: "Копировать URL", + copy_url_toast_success: "URL модуля скопирован в буфер.", + copy_url_toast_error: "Ошибка при копировании URL модуля.", + }, + page: { + title: "Действия со страницей", + indicator: "Страница", + lock: "Заблокировать", + unlock: "Разблокировать", + make_private: "Сделать приватной", + make_public: "Сделать публичной", + archive: "Архивировать", + restore: "Восстановить", + add_to_favorites: "Добавить в избранное", + remove_from_favorites: "Удалить из избранного", + copy_url: "Копировать URL", + copy_url_toast_success: "URL страницы скопирован в буфер.", + copy_url_toast_error: "Ошибка при копировании URL страницы.", + }, + }, + creation_actions: { + create_work_item: "Новый рабочий элемент", + create_page: "Новая страница", + create_view: "Новое представление", + create_cycle: "Новый цикл", + create_module: "Новый модуль", + create_project: "Новый проект", + create_workspace: "Новое рабочее пространство", + }, + navigation_actions: { + open_workspace: "Открыть рабочее пространство", + nav_home: "Перейти на главную", + nav_inbox: "Перейти во входящие", + nav_your_work: "Перейти к вашей работе", + nav_account_settings: "Перейти к настройкам аккаунта", + open_project: "Открыть проект", + nav_projects_list: "Перейти к списку проектов", + nav_all_workspace_work_items: "Перейти ко всем рабочим элементам", + nav_assigned_workspace_work_items: "Перейти к назначенным рабочим элементам", + nav_created_workspace_work_items: "Перейти к созданным рабочим элементам", + nav_subscribed_workspace_work_items: "Перейти к отслеживаемым рабочим элементам", + nav_workspace_analytics: "Перейти к аналитике", + nav_workspace_drafts: "Перейти к черновикам", + nav_workspace_archives: "Перейти к архивам", + open_workspace_setting: "Открыть настройку рабочего пространства", + nav_workspace_settings: "Перейти к настройкам рабочего пространства", + nav_project_work_items: "Перейти к рабочим элементам", + open_project_cycle: "Открыть цикл", + nav_project_cycles: "Перейти к циклам", + open_project_module: "Открыть модуль", + nav_project_modules: "Перейти к модулям", + open_project_view: "Открыть представление проекта", + nav_project_views: "Перейти к представлениям проекта", + nav_project_pages: "Перейти к страницам", + nav_project_intake: "Перейти к предложениям", + nav_project_archives: "Перейти к архивам проекта", + open_project_setting: "Открыть настройку проекта", + nav_project_settings: "Перейти к настройкам проекта", + }, + account_actions: { + sign_out: "Выйти", + workspace_invites: "Приглашения в рабочее пространство", + }, + miscellaneous_actions: { + toggle_app_sidebar: "Переключить боковую панель", + copy_current_page_url: "Копировать URL текущей страницы", + copy_current_page_url_toast_success: "URL текущей страницы скопирован в буфер.", + copy_current_page_url_toast_error: "Ошибка при копировании URL текущей страницы.", + focus_top_nav_search: "Перейти к поиску", + }, + preferences_actions: { + update_theme: "Изменить тему интерфейса", + update_timezone: "Изменить часовой пояс", + update_start_of_week: "Изменить первый день недели", + update_language: "Изменить язык интерфейса", + toast: { + theme: { + success: "Тема успешно обновлена.", + error: "Не удалось обновить тему. Попробуйте снова.", + }, + timezone: { + success: "Часовой пояс успешно обновлён.", + error: "Не удалось обновить часовой пояс. Попробуйте снова.", + }, + generic: { + success: "Настройки успешно обновлены.", + error: "Не удалось обновить настройки. Попробуйте снова.", + }, + }, + }, + help_actions: { + open_keyboard_shortcuts: "Открыть горячие клавиши", + open_plane_documentation: "Открыть документацию Plane", + join_discord: "Присоединиться к Discord", + report_bug: "Сообщить об ошибке", + chat_with_us: "Написать нам", + }, + page_placeholders: { + default: "Введите команду или поиск", + open_workspace: "Открыть рабочее пространство", + open_project: "Открыть проект", + open_workspace_setting: "Открыть настройку рабочего пространства", + open_project_cycle: "Открыть цикл", + open_project_module: "Открыть модуль", + open_project_view: "Открыть представление проекта", + open_project_setting: "Открыть настройку проекта", + update_work_item_state: "Изменить статус", + update_work_item_priority: "Изменить приоритет", + update_work_item_assignee: "Назначить", + update_work_item_estimate: "Изменить оценку", + update_work_item_cycle: "Добавить в цикл", + update_work_item_module: "Добавить в модули", + update_work_item_labels: "Добавить метки", + update_module_member: "Изменить участников", + update_module_status: "Изменить статус", + update_theme: "Изменить тему", + update_timezone: "Изменить часовой пояс", + update_start_of_week: "Изменить первый день недели", + update_language: "Изменить язык", + }, + search_menu: { + no_results: "Ничего не найдено", + clear_search: "Очистить поиск", + }, + footer: { + workspace_level: "Уровень рабочего пространства", + }, + group_titles: { + contextual: "Контекстные", + navigation: "Навигация", + create: "Создать", + general: "Общие", + settings: "Настройки", + account: "Аккаунт", + miscellaneous: "Прочее", + preferences: "Предпочтения", + help: "Помощь", + }, + }, + customize_navigation: "Настроить навигацию", + personal: "Личное", + accordion_navigation_control: "Аккордеонная навигация", + horizontal_navigation_bar: "Вкладочная навигация", + show_limited_projects_on_sidebar: "Показывать ограниченное число проектов", + enter_number_of_projects: "Введите количество проектов", + pin: "Закрепить", + unpin: "Открепить", + sidebar: { + stickies: "Стикеры", + your_work: "Ваша работа", + }, } as const; diff --git a/packages/i18n/src/locales/ua/empty-state.ts b/packages/i18n/src/locales/ua/empty-state.ts index b0bc9e9712..3fe159e162 100644 --- a/packages/i18n/src/locales/ua/empty-state.ts +++ b/packages/i18n/src/locales/ua/empty-state.ts @@ -8,8 +8,7 @@ export default { common_empty_state: { progress: { title: "Наразі немає метрик прогресу для відображення.", - description: - "Почніть встановлювати значення властивостей у робочих одиницях, щоб побачити тут метрики прогресу.", + description: "Почніть встановлювати значення властивостей у робочих одиницях, щоб побачити тут метрики прогресу.", }, updates: { title: "Ще немає оновлень.", @@ -21,14 +20,12 @@ export default { }, not_found: { title: "Схоже, сталася помилка", - description: - "Наразі не вдається отримати дані вашого облікового запису Plane. Можливо, це помилка мережі.", + description: "Наразі не вдається отримати дані вашого облікового запису Plane. Можливо, це помилка мережі.", cta_primary: "Спробуйте перезавантажити сторінку", }, server_error: { title: "Помилка сервера", - description: - "Наразі не вдається підключитися та отримати дані з сервера. Ми вже працюємо над цим.", + description: "Наразі не вдається підключитися та отримати дані з сервера. Ми вже працюємо над цим.", cta_primary: "Спробуйте перезавантажити сторінку", }, }, @@ -83,8 +80,7 @@ export default { }, no_work_items_in_project: { title: "У проєкті ще немає робочих одиниць", - description: - "Додайте робочі одиниці до проєкту та розділіть роботу на відстежувані частини за допомогою подань.", + description: "Додайте робочі одиниці до проєкту та розділіть роботу на відстежувані частини за допомогою подань.", cta_primary: "Додати робочу одиницю", }, work_item_filter: { @@ -173,32 +169,27 @@ export default { title: "Створіть модулі для організації вашої роботи та відстеження прогресу через різні фази.", }, analytics_no_intake: { - title: - "Налаштуйте надходження для керування запитами та відстеження того, як їх приймають або відхиляють.", + title: "Налаштуйте надходження для керування запитами та відстеження того, як їх приймають або відхиляють.", }, }, settings_empty_state: { estimates: { title: "Ще немає оцінок", - description: - "Визначте, як команда вимірює зусилля, та відстежуйте це послідовно для всіх робочих одиниць.", + description: "Визначте, як команда вимірює зусилля, та відстежуйте це послідовно для всіх робочих одиниць.", cta_primary: "Додати систему оцінок", }, labels: { title: "Ще немає міток", - description: - "Створіть персоналізовані мітки для ефективної категоризації та керування робочими одиницями.", + description: "Створіть персоналізовані мітки для ефективної категоризації та керування робочими одиницями.", cta_primary: "Створіть свою першу мітку", }, exports: { title: "Ще немає експортів", - description: - "Наразі немає жодних записів експорту. Після першого експорту всі записи з’являться тут.", + description: "Наразі немає жодних записів експорту. Після першого експорту всі записи з’являться тут.", }, tokens: { title: "Ще немає персонального токена", - description: - "Створюйте безпечні API-токени для підключення робочого простору до зовнішніх систем і застосунків.", + description: "Створюйте безпечні API-токени для підключення робочого простору до зовнішніх систем і застосунків.", cta_primary: "Додати API-токен", }, webhooks: { diff --git a/packages/i18n/src/locales/ua/translations.ts b/packages/i18n/src/locales/ua/translations.ts index b1bc4a7c8b..52a0e106b4 100644 --- a/packages/i18n/src/locales/ua/translations.ts +++ b/packages/i18n/src/locales/ua/translations.ts @@ -1311,7 +1311,8 @@ export default { request_button: "Запитати адміністратора інстанції", }, validation: { - name_alphanumeric: "Назви робочих просторів можуть містити лише « » (пробіл), «-», «_» і алфанумеричні символи.", + name_alphanumeric: + "Назви робочих просторів можуть містити лише « » (пробіл), «-», «_» і алфанумеричні символи.", name_length: "Назва обмежена 80 символами.", url_alphanumeric: "URL може містити лише «-» та алфанумеричні символи.", url_length: "URL обмежений 48 символами.", @@ -2004,8 +2005,7 @@ export default { automations: { label: "Автоматизація", heading: "Автоматизація", - description: - "Налаштовуйте автоматичні дії, щоб спростити керування проєктом і зменшити ручні операції.", + description: "Налаштовуйте автоматичні дії, щоб спростити керування проєктом і зменшити ручні операції.", "auto-archive": { title: "Автоматично архівувати закриті одиниці", description: "Plane архівуватиме завершені або скасовані одиниці.", diff --git a/packages/types/src/issues/issue_subscription.ts b/packages/types/src/issues/issue_subscription.ts index 0373b5075c..f7fc58efad 100644 --- a/packages/types/src/issues/issue_subscription.ts +++ b/packages/types/src/issues/issue_subscription.ts @@ -3,4 +3,3 @@ * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3242a956d2..c67cf3e380 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,11 +58,8 @@ catalogs: specifier: 18.3.1 version: 18.3.1 axios: - specifier: 1.12.0 - version: 1.12.0 - lodash-es: - specifier: 4.17.23 - version: 4.17.23 + specifier: 1.13.5 + version: 1.13.5 lucide-react: specifier: 0.469.0 version: 0.469.0 @@ -112,7 +109,12 @@ overrides: '@types/express': 4.17.23 typescript: 5.8.3 vite: 7.1.11 - qs: 6.14.1 + qs: 6.14.2 + diff: 5.2.2 + webpack: 5.104.1 + lodash-es: 4.17.23 + '@isaacs/brace-expansion': 5.0.1 + lodash: 4.17.23 importers: @@ -237,12 +239,12 @@ importers: version: 3.13.12 axios: specifier: 'catalog:' - version: 1.12.0 + version: 1.13.5 isbot: specifier: ^5.1.31 version: 5.1.31 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lucide-react: specifier: 'catalog:' @@ -373,7 +375,7 @@ importers: version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6) axios: specifier: 'catalog:' - version: 1.12.0 + version: 1.13.5 compression: specifier: 1.8.1 version: 1.8.1 @@ -518,7 +520,7 @@ importers: version: 10.27.0(@react-router/node@7.9.5(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) axios: specifier: 'catalog:' - version: 1.12.0 + version: 1.13.5 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -529,7 +531,7 @@ importers: specifier: ^5.1.31 version: 5.1.31 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lucide-react: specifier: 'catalog:' @@ -684,7 +686,7 @@ importers: version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: specifier: 'catalog:' - version: 1.12.0 + version: 1.13.5 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -707,7 +709,7 @@ importers: specifier: ^5.1.31 version: 5.1.31 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lucide-react: specifier: 'catalog:' @@ -1000,7 +1002,7 @@ importers: specifier: ^4.3.2 version: 4.3.2 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lowlight: specifier: ^3.0.0 @@ -1098,7 +1100,7 @@ importers: specifier: ^10.7.11 version: 10.7.16 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 mobx: specifier: 'catalog:' @@ -1252,7 +1254,7 @@ importers: version: link:../types axios: specifier: 'catalog:' - version: 1.12.0 + version: 1.13.5 file-type: specifier: ^21.0.0 version: 21.0.0 @@ -1279,7 +1281,7 @@ importers: specifier: workspace:* version: link:../utils lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 mobx: specifier: 'catalog:' @@ -1394,7 +1396,7 @@ importers: specifier: ^2.0.0 version: 2.1.1 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lucide-react: specifier: 'catalog:' @@ -1444,10 +1446,10 @@ importers: version: 8.6.14(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1))) '@storybook/addon-styling-webpack': specifier: ^1.0.0 - version: 1.0.1(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + version: 1.0.1(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/addon-webpack5-compiler-swc': specifier: ^1.0.2 - version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/blocks': specifier: ^8.1.1 version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1))) @@ -1518,7 +1520,7 @@ importers: specifier: ^10.1.2 version: 10.1.2 lodash-es: - specifier: 'catalog:' + specifier: 4.17.23 version: 4.17.23 lucide-react: specifier: 'catalog:' @@ -2453,8 +2455,8 @@ packages: resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': @@ -3781,7 +3783,7 @@ packages: '@storybook/addon-styling-webpack@1.0.1': resolution: {integrity: sha512-5n+SXPfMTc4m7sWaJWPWjoHYWc6/B111M2Ia55toQ3GV4ON4vVlTgH9FX+EgCkDticElj99HLTMDJkHRj2yvkg==} peerDependencies: - webpack: ^5.0.0 + webpack: 5.104.1 '@storybook/addon-toolbars@8.6.14': resolution: {integrity: sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==} @@ -3890,7 +3892,7 @@ packages: resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} peerDependencies: typescript: 5.8.3 - webpack: '>= 4' + webpack: 5.104.1 '@storybook/react-dom-shim@8.6.14': resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==} @@ -5191,8 +5193,8 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@1.12.0: - resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -5222,6 +5224,10 @@ packages: resolution: {integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==} hasBin: true + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -5281,6 +5287,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -5589,7 +5600,7 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 + webpack: 5.104.1 peerDependenciesMeta: '@rspack/core': optional: true @@ -5710,15 +5721,6 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5826,12 +5828,8 @@ packages: dfa@1.2.0: resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} doctrine@2.1.0: @@ -5924,6 +5922,9 @@ packages: electron-to-chromium@1.5.218: resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==} + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} @@ -6017,6 +6018,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -6437,10 +6441,10 @@ packages: engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: typescript: 5.8.3 - webpack: ^5.11.0 + webpack: 5.104.1 - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} forwarded-parse@2.1.2: @@ -6739,7 +6743,7 @@ packages: engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 + webpack: 5.104.1 peerDependenciesMeta: '@rspack/core': optional: true @@ -7292,8 +7296,8 @@ packages: lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} locate-path@3.0.0: @@ -7330,8 +7334,8 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} @@ -7848,6 +7852,9 @@ packages: node-releases@2.0.21: resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + normalize-package-data@5.0.0: resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8412,8 +8419,8 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -8829,6 +8836,10 @@ packages: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -9101,7 +9112,7 @@ packages: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: 5.104.1 style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -9129,7 +9140,7 @@ packages: resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: '@swc/core': ^1.2.147 - webpack: '>=2' + webpack: 5.104.1 swr@2.2.4: resolution: {integrity: sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ==} @@ -9159,7 +9170,23 @@ packages: '@swc/core': '*' esbuild: '*' uglify-js: '*' - webpack: ^5.1.0 + webpack: 5.104.1 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: 5.104.1 peerDependenciesMeta: '@swc/core': optional: true @@ -9515,6 +9542,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -9747,7 +9780,7 @@ packages: resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} engines: {node: '>= 14.15.0'} peerDependencies: - webpack: ^5.0.0 + webpack: 5.104.1 peerDependenciesMeta: webpack: optional: true @@ -9765,8 +9798,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.101.3: - resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10988,7 +11021,7 @@ snapshots: '@isaacs/balanced-match@4.0.1': {} - '@isaacs/brace-expansion@5.0.0': + '@isaacs/brace-expansion@5.0.1': dependencies: '@isaacs/balanced-match': 4.0.1 @@ -11946,7 +11979,7 @@ snapshots: exit-hook: 2.2.1 isbot: 5.1.31 jsesc: 3.0.2 - lodash: 4.17.21 + lodash: 4.17.23 p-map: 7.0.3 pathe: 1.1.2 picocolors: 1.1.1 @@ -12448,10 +12481,10 @@ snapshots: storybook: 9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)) ts-dedent: 2.2.0 - '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)))': + '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: '@storybook/node-logger': 8.6.14(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1))) - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) transitivePeerDependencies: - storybook @@ -12464,10 +12497,10 @@ snapshots: memoizerific: 1.11.3 storybook: 9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)))': + '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: '@swc/core': 1.13.5(@swc/helpers@0.5.17) - swc-loader: 0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + swc-loader: 0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) transitivePeerDependencies: - '@swc/helpers' - webpack @@ -12496,23 +12529,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) - html-webpack-plugin: 5.6.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) + html-webpack-plugin: 5.6.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 storybook: 9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)) - style-loader: 3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) - webpack-dev-middleware: 6.1.3(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -12568,7 +12601,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.14(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1))) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -12579,7 +12612,7 @@ snapshots: semver: 7.7.3 storybook: 9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)) tsconfig-paths: 4.2.0 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -12594,7 +12627,7 @@ snapshots: dependencies: storybook: 9.1.17(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: debug: 4.4.3 endent: 2.1.0 @@ -12604,7 +12637,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color @@ -12863,7 +12896,7 @@ snapshots: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + lodash: 4.17.23 redent: 3.0.0 '@testing-library/jest-dom@6.9.1': @@ -14066,10 +14099,10 @@ snapshots: axe-core@4.10.3: {} - axios@1.12.0: + axios@1.13.5: dependencies: follow-redirects: 1.15.11 - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -14102,6 +14135,8 @@ snapshots: baseline-browser-mapping@2.8.4: {} + baseline-browser-mapping@2.9.19: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -14134,7 +14169,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -14180,6 +14215,14 @@ snapshots: node-releases: 2.0.21 update-browserslist-db: 1.1.3(browserslist@4.26.2) + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001759 + electron-to-chromium: 1.5.286 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + buffer-from@1.1.2: {} buffer@6.0.3: @@ -14493,7 +14536,7 @@ snapshots: crypto-js@4.2.0: {} - css-loader@6.11.0(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + css-loader@6.11.0(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -14504,7 +14547,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) css-select@4.3.0: dependencies: @@ -14617,11 +14660,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: - dependencies: - ms: 2.1.3 - optional: true - debug@4.4.3: dependencies: ms: 2.1.3 @@ -14699,9 +14737,7 @@ snapshots: dfa@1.2.0: {} - diff@5.2.0: {} - - diff@8.0.2: {} + diff@5.2.2: {} doctrine@2.1.0: dependencies: @@ -14797,6 +14833,8 @@ snapshots: electron-to-chromium@1.5.218: {} + electron-to-chromium@1.5.286: {} + element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 @@ -14935,6 +14973,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -15292,7 +15332,7 @@ snapshots: express-winston@4.2.0(winston@3.17.0): dependencies: chalk: 2.4.2 - lodash: 4.17.21 + lodash: 4.17.23 winston: 3.17.0 express-ws@5.0.2(express@4.22.0): @@ -15326,7 +15366,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -15482,7 +15522,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -15497,9 +15537,9 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) - form-data@4.0.4: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -15836,15 +15876,15 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + html-webpack-plugin@5.6.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) htmlparser2@6.1.0: dependencies: @@ -15871,7 +15911,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color optional: true @@ -15886,7 +15926,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color optional: true @@ -16422,7 +16462,7 @@ snapshots: lit-element: 3.3.3 lit-html: 2.8.0 - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} locate-path@3.0.0: dependencies: @@ -16453,7 +16493,7 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.17.21: {} + lodash@4.17.23: {} log-update@6.1.0: dependencies: @@ -17076,7 +17116,7 @@ snapshots: minimatch@10.1.1: dependencies: - '@isaacs/brace-expansion': 5.0.0 + '@isaacs/brace-expansion': 5.0.1 minimatch@3.1.2: dependencies: @@ -17202,6 +17242,8 @@ snapshots: node-releases@2.0.21: {} + node-releases@2.0.27: {} + normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.3 @@ -17629,7 +17671,7 @@ snapshots: pretty-error@4.0.0: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 renderkid: 3.0.0 pretty-format@27.5.1: @@ -17788,7 +17830,7 @@ snapshots: pure-rand@6.1.0: {} - qs@6.14.1: + qs@6.14.2: dependencies: side-channel: 1.1.0 @@ -17825,7 +17867,7 @@ snapshots: react-color@2.19.3(react@18.3.1): dependencies: '@icons/material': 0.2.4(react@18.3.1) - lodash: 4.17.21 + lodash: 4.17.23 lodash-es: 4.17.23 material-colors: 1.2.6 prop-types: 15.8.1 @@ -17931,7 +17973,7 @@ snapshots: create-react-class: 15.7.0 element-resize-detector: 1.2.4 imagesloaded: 4.1.4 - lodash: 4.17.21 + lodash: 4.17.23 masonry-layout: 4.2.2 prop-types: 15.8.1 react: 18.3.1 @@ -18022,7 +18064,7 @@ snapshots: reactcss@1.2.3(react@18.3.1): dependencies: - lodash: 4.17.21 + lodash: 4.17.23 react: 18.3.1 read-cache@1.0.0: @@ -18055,7 +18097,7 @@ snapshots: dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 @@ -18179,7 +18221,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 strip-ansi: 6.0.1 require-directory@2.1.1: {} @@ -18365,6 +18407,13 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.1 @@ -18739,9 +18788,9 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - style-loader@3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + style-loader@3.3.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) style-to-object@0.4.4: dependencies: @@ -18763,11 +18812,11 @@ snapshots: svg-arc-to-cubic-bezier@3.2.0: {} - swc-loader@0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + swc-loader@0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: '@swc/core': 1.13.5(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) swr@2.2.4(react@18.3.1): dependencies: @@ -18786,14 +18835,25 @@ snapshots: tapable@2.3.0: {} - terser-webpack-plugin@5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + terser-webpack-plugin@5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) + optionalDependencies: + '@swc/core': 1.13.5(@swc/helpers@0.5.17) + + terser-webpack-plugin@5.3.16(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.43.1 + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) optionalDependencies: '@swc/core': 1.13.5(@swc/helpers@0.5.17) @@ -18923,7 +18983,7 @@ snapshots: cac: 6.7.14 chokidar: 3.6.0 debug: 4.4.3 - diff: 8.0.2 + diff: 5.2.2 empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.46 @@ -19181,6 +19241,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -19201,7 +19267,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 + qs: 6.14.2 use-callback-ref@1.3.3(@types/react@18.3.11)(react@18.3.1): dependencies: @@ -19250,7 +19316,7 @@ snapshots: uvu@0.5.6: dependencies: dequal: 2.0.3 - diff: 5.2.0 + diff: 5.2.2 kleur: 4.1.5 sade: 1.8.1 @@ -19427,7 +19493,7 @@ snapshots: webidl-conversions@7.0.0: optional: true - webpack-dev-middleware@6.1.3(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))): + webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -19435,7 +19501,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) webpack-hot-middleware@2.26.1: dependencies: @@ -19449,7 +19515,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17)): + webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -19459,21 +19525,21 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 + schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.16(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c5e2371708..5940f97ed4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,7 +22,7 @@ catalog: "@types/node": 22.12.0 "@types/react-dom": 18.3.1 "@types/react": 18.3.11 - axios: 1.12.0 + axios: 1.13.5 express: 4.22.0 lodash-es: 4.17.23 lucide-react: 0.469.0