From abe8df4ecacc3e6a90d6532e8f65819e0844abf8 Mon Sep 17 00:00:00 2001 From: "M. Palanikannan" <73993394+Palanikannan1437@users.noreply.github.com> Date: Sat, 2 Sep 2023 00:45:34 +0530 Subject: [PATCH 01/14] added table-icons for left,right columns and top,bottom rows (#2061) --- .../table-menu/InsertBottomTableIcon.tsx | 15 +++++++++++ .../tiptap/table-menu/InsertLeftTableIcon.tsx | 14 +++++++++++ .../table-menu/InsertRightTableIcon.tsx | 15 +++++++++++ .../tiptap/table-menu/InsertTopTableIcon.tsx | 14 +++++++++++ .../components/tiptap/table-menu/index.tsx | 25 +++++++++++++++---- 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx create mode 100644 apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx create mode 100644 apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx create mode 100644 apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx diff --git a/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx new file mode 100644 index 000000000..b3f99855e --- /dev/null +++ b/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx @@ -0,0 +1,15 @@ +const InsertBottomTableIcon = (props: any) => ( + + + +) + +export default InsertBottomTableIcon; diff --git a/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx new file mode 100644 index 000000000..8a92705d8 --- /dev/null +++ b/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx @@ -0,0 +1,14 @@ +const InsertLeftTableIcon = (props: any) => ( + + + +) +export default InsertLeftTableIcon diff --git a/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx new file mode 100644 index 000000000..04348ece1 --- /dev/null +++ b/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx @@ -0,0 +1,15 @@ +const InsertRightTableIcon = (props: any) => ( + + + +) + +export default InsertRightTableIcon diff --git a/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx new file mode 100644 index 000000000..14036f998 --- /dev/null +++ b/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx @@ -0,0 +1,14 @@ +const InsertTopTableIcon = (props: any) => ( + + + +) +export default InsertTopTableIcon; diff --git a/apps/app/components/tiptap/table-menu/index.tsx b/apps/app/components/tiptap/table-menu/index.tsx index 0da68410e..e6513fc43 100644 --- a/apps/app/components/tiptap/table-menu/index.tsx +++ b/apps/app/components/tiptap/table-menu/index.tsx @@ -2,6 +2,10 @@ import { useState, useEffect } from "react"; import { Rows, Columns, ToggleRight } from "lucide-react"; import { cn } from "../utils"; import { Tooltip } from "components/ui"; +import InsertLeftTableIcon from "./InsertLeftTableIcon"; +import InsertRightTableIcon from "./InsertRightTableIcon"; +import InsertTopTableIcon from "./InsertTopTableIcon"; +import InsertBottomTableIcon from "./InsertBottomTableIcon"; interface TableMenuItem { command: () => void; @@ -24,13 +28,25 @@ export const TableMenu = ({ editor }: { editor: any }) => { const items: TableMenuItem[] = [ { command: () => editor.chain().focus().addColumnBefore().run(), - icon: Columns, + icon: InsertLeftTableIcon, + key: "insert-column-left", + name: "Insert 1 column left", + }, + { + command: () => editor.chain().focus().addColumnAfter().run(), + icon: InsertRightTableIcon, key: "insert-column-right", name: "Insert 1 column right", }, + { + command: () => editor.chain().focus().addRowBefore().run(), + icon: InsertTopTableIcon, + key: "insert-row-above", + name: "Insert 1 row above", + }, { command: () => editor.chain().focus().addRowAfter().run(), - icon: Rows, + icon: InsertBottomTableIcon, key: "insert-row-below", name: "Insert 1 row below", }, @@ -99,9 +115,8 @@ export const TableMenu = ({ editor }: { editor: any }) => { return (
Date: Sat, 2 Sep 2023 13:47:21 +0530 Subject: [PATCH 02/14] [chore] Added Husky for Automating Building and Linting Projects Before Push (#2032) * chore: Added Husky as Root Dependency * chore: Added Husky Prepush Script * chore: Modified Husky Pre-Push Script to Conditionally Build Projects * chore: added husky as dev dependency --- .husky/pre-push | 23 +++++++++++++++++++++++ package.json | 5 ++++- yarn.lock | 5 +++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100755 .husky/pre-push diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 000000000..1feec0de6 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,23 @@ +#!/bin/sh +. "$(dirname -- "$0")/_/husky.sh" + +changed_files=$(git diff --name-only HEAD~1) + +app_changed=$(echo "$changed_files" | grep -E '^apps/app/' || true) +space_changed=$(echo "$changed_files" | grep -E '^apps/space/' || true) +echo $app_changed +echo $space_changed + +if [ -n "$app_changed" ] && [ -n "$space_changed" ]; then + echo "Changes detected in both apps/app and apps/space. Building..." + yarn run lint + yarn run build +elif [ -n "$app_changed" ]; then + echo "Changes detected in apps/app. Building..." + yarn run lint --filter=app + yarn run build --filter=app +elif [ -n "$space_changed" ]; then + echo "Changes detected in apps/space. Building..." + yarn run lint --filter=space + yarn run build --filter=space +fi diff --git a/package.json b/package.json index 804fb7b64..b99978f20 100644 --- a/package.json +++ b/package.json @@ -7,16 +7,19 @@ "packages/*" ], "scripts": { + "prepare": "husky install", "build": "turbo run build", "dev": "turbo run dev", "start": "turbo run start", "lint": "turbo run lint", "clean": "turbo run clean" }, + "devDependencies": { "eslint-config-custom": "*", "prettier": "latest", - "turbo": "latest" + "turbo": "latest", + "husky": "^8.0.3" }, "packageManager": "yarn@1.22.19" } diff --git a/yarn.lock b/yarn.lock index a48c94e92..60cba9408 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4891,6 +4891,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + idb@^7.0.1: version "7.1.1" resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" From 874d6e951b4746edf9e334d1705a6e8609c16a7b Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Sat, 2 Sep 2023 19:43:17 +0530 Subject: [PATCH 03/14] dev: updated error handling for project deploy board attributes (#2062) * dev: updated error handling for project deploy board attributes * dev: reaction integrity handling --- apiserver/plane/api/views/issue.py | 139 +++++++++++++++++------------ 1 file changed, 80 insertions(+), 59 deletions(-) diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 74b574423..3d6b59c7f 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -21,7 +21,7 @@ from django.db.models import ( from django.core.serializers.json import DjangoJSONEncoder from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page -from django.db.models.functions import Coalesce +from django.db import IntegrityError from django.conf import settings # Third Party imports @@ -1545,32 +1545,35 @@ class IssueCommentPublicViewSet(BaseViewSet): return super(IssueCommentPublicViewSet, self).get_permissions() def get_queryset(self): - project_deploy_board = ProjectDeployBoard.objects.get( - workspace__slug=self.kwargs.get("slug"), - project_id=self.kwargs.get("project_id"), - ) - if project_deploy_board.comments: - return self.filter_queryset( - super() - .get_queryset() - .filter(workspace__slug=self.kwargs.get("slug")) - .filter(issue_id=self.kwargs.get("issue_id")) - .filter(access="EXTERNAL") - .select_related("project") - .select_related("workspace") - .select_related("issue") - .annotate( - is_member=Exists( - ProjectMember.objects.filter( - workspace__slug=self.kwargs.get("slug"), - project_id=self.kwargs.get("project_id"), - member_id=self.request.user.id, + try: + project_deploy_board = ProjectDeployBoard.objects.get( + workspace__slug=self.kwargs.get("slug"), + project_id=self.kwargs.get("project_id"), + ) + if project_deploy_board.comments: + return self.filter_queryset( + super() + .get_queryset() + .filter(workspace__slug=self.kwargs.get("slug")) + .filter(issue_id=self.kwargs.get("issue_id")) + .filter(access="EXTERNAL") + .select_related("project") + .select_related("workspace") + .select_related("issue") + .annotate( + is_member=Exists( + ProjectMember.objects.filter( + workspace__slug=self.kwargs.get("slug"), + project_id=self.kwargs.get("project_id"), + member_id=self.request.user.id, + ) ) ) + .distinct() ) - .distinct() - ) - else: + else: + return IssueComment.objects.none() + except ProjectDeployBoard.DoesNotExist: return IssueComment.objects.none() def create(self, request, slug, project_id, issue_id): @@ -1703,21 +1706,24 @@ class IssueReactionPublicViewSet(BaseViewSet): model = IssueReaction def get_queryset(self): - project_deploy_board = ProjectDeployBoard.objects.get( - workspace__slug=self.kwargs.get("slug"), - project_id=self.kwargs.get("project_id"), - ) - if project_deploy_board.reactions: - return ( - super() - .get_queryset() - .filter(workspace__slug=self.kwargs.get("slug")) - .filter(project_id=self.kwargs.get("project_id")) - .filter(issue_id=self.kwargs.get("issue_id")) - .order_by("-created_at") - .distinct() + try: + project_deploy_board = ProjectDeployBoard.objects.get( + workspace__slug=self.kwargs.get("slug"), + project_id=self.kwargs.get("project_id"), ) - else: + if project_deploy_board.reactions: + return ( + super() + .get_queryset() + .filter(workspace__slug=self.kwargs.get("slug")) + .filter(project_id=self.kwargs.get("project_id")) + .filter(issue_id=self.kwargs.get("issue_id")) + .order_by("-created_at") + .distinct() + ) + else: + return IssueReaction.objects.none() + except ProjectDeployBoard.DoesNotExist: return IssueReaction.objects.none() def create(self, request, slug, project_id, issue_id): @@ -1818,21 +1824,24 @@ class CommentReactionPublicViewSet(BaseViewSet): model = CommentReaction def get_queryset(self): - project_deploy_board = ProjectDeployBoard.objects.get( - workspace__slug=self.kwargs.get("slug"), - project_id=self.kwargs.get("project_id"), - ) - if project_deploy_board.reactions: - return ( - super() - .get_queryset() - .filter(workspace__slug=self.kwargs.get("slug")) - .filter(project_id=self.kwargs.get("project_id")) - .filter(comment_id=self.kwargs.get("comment_id")) - .order_by("-created_at") - .distinct() + try: + project_deploy_board = ProjectDeployBoard.objects.get( + workspace__slug=self.kwargs.get("slug"), + project_id=self.kwargs.get("project_id"), ) - else: + if project_deploy_board.reactions: + return ( + super() + .get_queryset() + .filter(workspace__slug=self.kwargs.get("slug")) + .filter(project_id=self.kwargs.get("project_id")) + .filter(comment_id=self.kwargs.get("comment_id")) + .order_by("-created_at") + .distinct() + ) + else: + return CommentReaction.objects.none() + except ProjectDeployBoard.DoesNotExist: return CommentReaction.objects.none() def create(self, request, slug, project_id, comment_id): @@ -1939,13 +1948,23 @@ class IssueVotePublicViewSet(BaseViewSet): serializer_class = IssueVoteSerializer def get_queryset(self): - return ( - super() - .get_queryset() - .filter(issue_id=self.kwargs.get("issue_id")) - .filter(workspace__slug=self.kwargs.get("slug")) - .filter(project_id=self.kwargs.get("project_id")) - ) + try: + project_deploy_board = ProjectDeployBoard.objects.get( + workspace__slug=self.kwargs.get("slug"), + project_id=self.kwargs.get("project_id"), + ) + if project_deploy_board.votes: + return ( + super() + .get_queryset() + .filter(issue_id=self.kwargs.get("issue_id")) + .filter(workspace__slug=self.kwargs.get("slug")) + .filter(project_id=self.kwargs.get("project_id")) + ) + else: + return IssueVote.objects.none() + except ProjectDeployBoard.DoesNotExist: + return IssueVote.objects.none() def create(self, request, slug, project_id, issue_id): try: @@ -1974,6 +1993,8 @@ class IssueVotePublicViewSet(BaseViewSet): ) serializer = IssueVoteSerializer(issue_vote) return Response(serializer.data, status=status.HTTP_201_CREATED) + except IntegrityError: + return Response({"error": "Reaction already exists"}, status=status.HTTP_400_BAD_REQUEST) except Exception as e: capture_exception(e) return Response( From 20e36194b4182437e821c8ca9ffadfdbd923affd Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Sun, 3 Sep 2023 11:25:37 +0530 Subject: [PATCH 04/14] fix: peek overview layout switch (#2064) --- .../issues/peek-overview/layout.tsx | 60 ++++++++++--------- .../issues/peek-overview/layout.tsx | 24 ++++---- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/apps/app/components/issues/peek-overview/layout.tsx b/apps/app/components/issues/peek-overview/layout.tsx index 40737b6e8..57bcb904c 100644 --- a/apps/app/components/issues/peek-overview/layout.tsx +++ b/apps/app/components/issues/peek-overview/layout.tsx @@ -151,35 +151,37 @@ export const IssuePeekOverview: React.FC = observer( leaveFrom="opacity-100" leaveTo="opacity-0" > - - {peekOverviewMode === "modal" && ( - setDeleteIssueModal(true)} - handleUpdateIssue={handleUpdateIssue} - issue={issue} - mode={peekOverviewMode} - readOnly={readOnly} - setMode={(mode) => setPeekOverviewMode(mode)} - workspaceSlug={workspaceSlug} - /> - )} - {peekOverviewMode === "full" && ( - setDeleteIssueModal(true)} - handleUpdateIssue={handleUpdateIssue} - issue={issue} - mode={peekOverviewMode} - readOnly={readOnly} - setMode={(mode) => setPeekOverviewMode(mode)} - workspaceSlug={workspaceSlug} - /> - )} + +
+ {peekOverviewMode === "modal" && ( + setDeleteIssueModal(true)} + handleUpdateIssue={handleUpdateIssue} + issue={issue} + mode={peekOverviewMode} + readOnly={readOnly} + setMode={(mode) => setPeekOverviewMode(mode)} + workspaceSlug={workspaceSlug} + /> + )} + {peekOverviewMode === "full" && ( + setDeleteIssueModal(true)} + handleUpdateIssue={handleUpdateIssue} + issue={issue} + mode={peekOverviewMode} + readOnly={readOnly} + setMode={(mode) => setPeekOverviewMode(mode)} + workspaceSlug={workspaceSlug} + /> + )} +
diff --git a/apps/space/components/issues/peek-overview/layout.tsx b/apps/space/components/issues/peek-overview/layout.tsx index abb76db48..09cfa5b78 100644 --- a/apps/space/components/issues/peek-overview/layout.tsx +++ b/apps/space/components/issues/peek-overview/layout.tsx @@ -106,17 +106,19 @@ export const IssuePeekOverview: React.FC = observer((props) => { leaveFrom="opacity-100" leaveTo="opacity-0" > - - {issueDetailStore.peekMode === "modal" && ( - - )} - {issueDetailStore.peekMode === "full" && ( - - )} + +
+ {issueDetailStore.peekMode === "modal" && ( + + )} + {issueDetailStore.peekMode === "full" && ( + + )} +
From 1e152c666cb2e1258df27268a77920e3b11f571f Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Sun, 3 Sep 2023 18:50:30 +0530 Subject: [PATCH 05/14] New Directory Setup (#2065) * chore: moved app & space from apps to root * chore: modified workspace configuration * chore: modified dockerfiles for space and web * chore: modified icons for space * feat: updated files for new svg icons supported by next-images * chore: added /spaces base path for next * chore: added compose config for space * chore: updated husky configuration * chore: updated workflows for new configuration * chore: changed app name to web * fix: resolved build errors with web * chore: reset file tracing root for both projects * chore: added nginx config for deploy * fix: eslint and tsconfig settings for space app * husky setup fixes based on new dir * eslint fixes * prettier formatting --------- Co-authored-by: Henit Chobisa --- .eslintrc.js | 2 +- .github/workflows/Build_Test_Pull_Request.yml | 10 +- .github/workflows/Update_Docker_Images.yml | 4 +- .gitpod.yml | 11 + .husky/pre-push | 20 +- CODE_OF_CONDUCT.md | 24 +- README.md | 28 +- apps/app/components/icons/blocked-icon.tsx | 25 -- apps/app/components/icons/blocker-icon.tsx | 25 -- apps/app/components/icons/bolt-icon.tsx | 16 - apps/app/components/icons/cancel-icon.tsx | 16 - apps/app/components/icons/clipboard-icon.tsx | 19 - apps/app/components/icons/comment-icon.tsx | 16 - .../components/icons/completed-cycle-icon.tsx | 17 - .../components/icons/current-cycle-icon.tsx | 17 - apps/app/components/icons/edit-icon.tsx | 19 - .../icons/ellipsis-horizontal-icon.tsx | 19 - apps/app/components/icons/lock-icon.tsx | 16 - apps/app/components/icons/menu-icon.tsx | 19 - apps/app/components/icons/plus-icon.tsx | 19 - .../icons/question-mark-circle-icon.tsx | 20 - .../components/icons/signal-cellular-icon.tsx | 19 - apps/app/components/icons/tag-icon.tsx | 24 -- apps/app/components/icons/transfer-icon.tsx | 16 - apps/app/components/icons/tune-icon.tsx | 19 - .../components/icons/upcoming-cycle-icon.tsx | 17 - .../app/components/icons/user-icon-circle.tsx | 16 - apps/app/components/icons/user-icon.tsx | 19 - .../app/components/integration/slack/index.ts | 1 - .../table-menu/InsertBottomTableIcon.tsx | 15 - .../tiptap/table-menu/InsertLeftTableIcon.tsx | 14 - .../table-menu/InsertRightTableIcon.tsx | 15 - .../tiptap/table-menu/InsertTopTableIcon.tsx | 14 - apps/space/public/logos/github-black.png | Bin 14032 -> 0 bytes apps/space/public/logos/github-square.png | Bin 2352 -> 0 bytes apps/space/public/logos/github-white.png | Bin 16559 -> 0 bytes apps/space/public/plane-logo.webp | Bin 566 -> 0 bytes .../public/plane-logos/blue-without-text.png | Bin 2460 -> 0 bytes apps/space/tsconfig.json | 23 -- docker-compose.yml | 342 +++++++++--------- nginx/nginx.conf.template | 4 + package.json | 7 +- packages/eslint-config-custom/index.js | 2 +- {apps/space => space}/.env.example | 0 {apps/app => space}/.eslintrc.js | 0 {apps/space => space}/.gitignore | 0 {apps/space => space}/.prettierignore | 0 {apps/space => space}/.prettierrc.json | 0 {apps/space => space}/Dockerfile.space | 11 +- {apps/space => space}/README.md | 0 .../components/accounts/email-code-form.tsx | 0 .../accounts/email-password-form.tsx | 0 .../accounts/email-reset-password-form.tsx | 0 .../accounts/github-login-button.tsx | 4 +- .../components/accounts/google-login.tsx | 0 .../components/accounts/index.ts | 0 .../components/accounts/onboarding-form.tsx | 0 .../space => space}/components/icons/index.ts | 0 .../icons/issue-group/backlog-state-icon.tsx | 0 .../issue-group/cancelled-state-icon.tsx | 0 .../issue-group/completed-state-icon.tsx | 0 .../icons/issue-group/started-state-icon.tsx | 0 .../issue-group/unstarted-state-icon.tsx | 0 .../components/icons/types.d.ts | 0 .../issues/board-views/block-downvotes.tsx | 0 .../issues/board-views/block-due-date.tsx | 0 .../issues/board-views/block-labels.tsx | 0 .../issues/board-views/block-priority.tsx | 0 .../issues/board-views/block-state.tsx | 0 .../issues/board-views/block-upvotes.tsx | 0 .../issues/board-views/calendar/index.tsx | 0 .../issues/board-views/gantt/index.tsx | 0 .../issues/board-views/kanban/block.tsx | 2 +- .../issues/board-views/kanban/header.tsx | 0 .../issues/board-views/kanban/index.tsx | 0 .../issues/board-views/list/block.tsx | 2 +- .../issues/board-views/list/header.tsx | 0 .../issues/board-views/list/index.tsx | 0 .../issues/board-views/spreadsheet/index.tsx | 0 .../issues/filters-render/index.tsx | 0 .../label/filter-label-block.tsx | 0 .../issues/filters-render/label/index.tsx | 0 .../priority/filter-priority-block.tsx | 0 .../issues/filters-render/priority/index.tsx | 0 .../state/filter-state-block.tsx | 0 .../issues/filters-render/state/index.tsx | 0 .../components/issues/navbar/index.tsx | 0 .../issues/navbar/issue-board-view.tsx | 0 .../components/issues/navbar/issue-filter.tsx | 0 .../components/issues/navbar/issue-view.tsx | 0 .../components/issues/navbar/search.tsx | 0 .../components/issues/navbar/theme.tsx | 0 .../issues/peek-overview/add-comment.tsx | 0 .../peek-overview/comment-detail-card.tsx | 0 .../peek-overview/full-screen-peek-view.tsx | 0 .../issues/peek-overview/header.tsx | 0 .../components/issues/peek-overview/index.ts | 0 .../issues/peek-overview/issue-activity.tsx | 0 .../issues/peek-overview/issue-details.tsx | 0 .../peek-overview/issue-emoji-reactions.tsx | 0 .../issues/peek-overview/issue-properties.tsx | 0 .../issues/peek-overview/issue-reaction.tsx | 0 .../peek-overview/issue-vote-reactions.tsx | 0 .../issues/peek-overview/layout.tsx | 0 .../issues/peek-overview/side-peek-view.tsx | 0 .../components/tiptap/bubble-menu/index.tsx | 0 .../tiptap/bubble-menu/link-selector.tsx | 7 +- .../tiptap/bubble-menu/node-selector.tsx | 10 +- .../bubble-menu/utils/link-validator.tsx | 1 - .../tiptap/extensions/image-resize.tsx | 19 +- .../components/tiptap/extensions/index.tsx | 8 +- .../tiptap/extensions/updated-image.tsx | 2 +- .../components/tiptap/index.tsx | 4 +- .../tiptap/plugins/delete-image.tsx | 6 +- .../tiptap/plugins/upload-image.tsx | 29 +- .../components/tiptap/props.tsx | 18 +- .../components/tiptap/slash-command/index.tsx | 248 ++++++------- .../app => space}/components/tiptap/utils.ts | 0 .../components/ui/dropdown.tsx | 0 {apps/space => space}/components/ui/icon.tsx | 0 {apps/space => space}/components/ui/index.ts | 0 {apps/space => space}/components/ui/input.tsx | 0 {apps/app => space}/components/ui/loader.tsx | 0 .../components/ui/primary-button.tsx | 0 .../components/ui/reaction-selector.tsx | 0 .../components/ui/secondary-button.tsx | 0 .../components/ui/toast-alert.tsx | 0 .../space => space}/components/ui/tooltip.tsx | 0 .../components/views/project-details.tsx | 0 {apps/space => space}/constants/data.ts | 0 {apps/space => space}/constants/helpers.ts | 0 {apps/space => space}/constants/seo.ts | 0 {apps/space => space}/constants/workspace.ts | 0 .../contexts/toast.context.tsx | 0 .../helpers/date-time.helper.ts | 0 .../space => space}/helpers/emoji.helper.tsx | 0 .../space => space}/helpers/string.helper.ts | 0 .../hooks/use-outside-click.tsx | 0 {apps/app => space}/hooks/use-timer.tsx | 0 {apps/app => space}/hooks/use-toast.tsx | 0 .../layouts/project-layout.tsx | 5 +- {apps/space => space}/lib/index.ts | 0 {apps/space => space}/lib/mobx/store-init.tsx | 0 .../app => space}/lib/mobx/store-provider.tsx | 0 {apps/space => space}/next.config.js | 8 +- {apps/space => space}/package.json | 3 + {apps/space => space}/pages/404.tsx | 3 +- .../[workspace_slug]/[project_slug]/index.tsx | 0 .../pages/[workspace_slug]/index.tsx | 2 - {apps/space => space}/pages/_app.tsx | 10 +- {apps/space => space}/pages/_document.tsx | 0 {apps/space => space}/pages/index.tsx | 2 +- .../pages/onboarding/index.tsx | 3 +- .../pages/project-not-published/index.tsx | 3 +- {apps/app => space}/postcss.config.js | 0 {apps/app => space}/public/404.svg | 0 .../public/favicon/android-chrome-192x192.png | Bin .../public/favicon/android-chrome-512x512.png | Bin .../public/favicon/apple-touch-icon.png | Bin .../public/favicon/favicon-16x16.png | Bin .../public/favicon/favicon-32x32.png | Bin .../app => space}/public/favicon/favicon.ico | Bin .../public/favicon/site.webmanifest | 0 space/public/logos/github-black.svg | 29 ++ space/public/logos/github-square.svg | 21 ++ space/public/logos/github-white.svg | 11 + space/public/plane-logo.svg | 94 +++++ .../black-horizontal-with-blue-logo.svg | 0 .../public/plane-logos/blue-without-text.svg | 15 + .../white-horizontal-with-blue-logo.svg | 0 .../public/plane-logos/white-horizontal.svg | 0 .../public/project-not-published.svg | 0 {apps/space => space}/services/api.service.ts | 0 .../services/authentication.service.ts | 0 .../space => space}/services/file.service.ts | 0 .../space => space}/services/issue.service.ts | 0 .../services/project.service.ts | 0 .../space => space}/services/user.service.ts | 0 {apps/space => space}/store/issue.ts | 0 {apps/space => space}/store/issue_details.ts | 0 {apps/space => space}/store/project.ts | 0 {apps/space => space}/store/root.ts | 0 {apps/space => space}/store/user.ts | 0 {apps/app => space}/styles/editor.css | 0 {apps/space => space}/styles/globals.css | 0 {apps/space => space}/tailwind.config.js | 0 {apps/app => space}/tsconfig.json | 0 {apps/space => space}/types/issue.ts | 0 {apps/space => space}/types/project.ts | 0 {apps/space => space}/types/theme.ts | 0 {apps/space => space}/types/user.ts | 0 web/.eslintrc.js | 7 + {apps/app => web}/.prettierrc | 0 {apps/app => web}/Dockerfile.dev | 0 {apps/app => web}/Dockerfile.web | 14 +- .../components/account/email-code-form.tsx | 0 .../account/email-password-form.tsx | 0 .../account/email-reset-password-form.tsx | 0 .../account/github-login-button.tsx | 0 .../components/account/google-login.tsx | 0 {apps/app => web}/components/account/index.ts | 0 .../create-update-analytics-modal.tsx | 0 .../custom-analytics/custom-analytics.tsx | 0 .../custom-analytics/graph/custom-tooltip.tsx | 0 .../custom-analytics/graph/index.tsx | 0 .../analytics/custom-analytics/index.ts | 0 .../analytics/custom-analytics/select-bar.tsx | 0 .../analytics/custom-analytics/sidebar.tsx | 0 .../analytics/custom-analytics/table.tsx | 0 .../app => web}/components/analytics/index.ts | 0 .../components/analytics/project-modal.tsx | 0 .../analytics/scope-and-demand/demand.tsx | 0 .../analytics/scope-and-demand/index.ts | 0 .../scope-and-demand/leaderboard.tsx | 0 .../scope-and-demand/scope-and-demand.tsx | 0 .../analytics/scope-and-demand/scope.tsx | 0 .../scope-and-demand/year-wise-issues.tsx | 0 .../components/analytics/select/index.ts | 0 .../components/analytics/select/project.tsx | 0 .../components/analytics/select/segment.tsx | 0 .../components/analytics/select/x-axis.tsx | 0 .../components/analytics/select/y-axis.tsx | 0 .../components/auth-screens/index.ts | 0 .../auth-screens/not-authorized-view.tsx | 0 .../components/auth-screens/project/index.ts | 0 .../auth-screens/project/join-project.tsx | 0 .../auth-screens/workspace/index.ts | 0 .../auth-screens/workspace/not-a-member.tsx | 0 .../automation/auto-archive-automation.tsx | 0 .../automation/auto-close-automation.tsx | 0 .../components/automation/index.ts | 0 .../automation/select-month-modal.tsx | 0 .../components/breadcrumbs/index.tsx | 0 .../change-interface-theme.tsx | 0 .../components/command-palette/command-k.tsx | 0 .../command-palette/command-pallette.tsx | 64 ++-- .../components/command-palette/helpers.tsx | 0 .../components/command-palette/index.ts | 0 .../issue/change-issue-assignee.tsx | 0 .../issue/change-issue-priority.tsx | 0 .../issue/change-issue-state.tsx | 0 .../components/command-palette/issue/index.ts | 0 .../command-palette/shortcuts-modal.tsx | 0 .../app => web}/components/core/activity.tsx | 0 .../core/filters/date-filter-modal.tsx | 0 .../core/filters/date-filter-select.tsx | 0 .../components/core/filters/filters-list.tsx | 0 .../components/core/filters/index.ts | 0 .../core/filters/issues-view-filter.tsx | 0 .../components/core/image-picker-popover.tsx | 0 {apps/app => web}/components/core/index.ts | 0 .../core/modals/bulk-delete-issues-modal.tsx | 0 .../modals/existing-issues-list-modal.tsx | 0 .../core/modals/gpt-assistant-modal.tsx | 0 .../core/modals/image-upload-modal.tsx | 0 .../components/core/modals/index.ts | 0 .../components/core/modals/link-modal.tsx | 0 .../components/core/reaction-selector.tsx | 0 .../components/core/sidebar/index.ts | 0 .../components/core/sidebar/links-list.tsx | 0 .../core/sidebar/progress-chart.tsx | 0 .../core/sidebar/sidebar-progress-stats.tsx | 0 .../core/sidebar/single-progress-stats.tsx | 0 .../core/theme/color-picker-input.tsx | 0 .../core/theme/custom-theme-selector.tsx | 0 .../components/core/theme/index.ts | 0 .../components/core/theme/theme-switch.tsx | 0 .../components/core/views/all-views.tsx | 0 .../core/views/board-view/all-boards.tsx | 0 .../core/views/board-view/board-header.tsx | 0 .../components/core/views/board-view/index.ts | 0 .../core/views/board-view/single-board.tsx | 0 .../core/views/board-view/single-issue.tsx | 0 .../views/calendar-view/calendar-header.tsx | 0 .../core/views/calendar-view/calendar.tsx | 0 .../core/views/calendar-view/index.ts | 0 .../core/views/calendar-view/single-date.tsx | 0 .../core/views/calendar-view/single-issue.tsx | 0 .../core/views/gantt-chart-view/index.tsx | 0 .../components/core/views/index.ts | 0 .../components/core/views/issues-view.tsx | 0 .../core/views/list-view/all-lists.tsx | 0 .../components/core/views/list-view/index.ts | 0 .../core/views/list-view/single-issue.tsx | 0 .../core/views/list-view/single-list.tsx | 0 .../core/views/spreadsheet-view/index.ts | 0 .../views/spreadsheet-view/single-issue.tsx | 0 .../spreadsheet-view/spreadsheet-columns.tsx | 0 .../spreadsheet-view/spreadsheet-issues.tsx | 0 .../spreadsheet-view/spreadsheet-view.tsx | 0 .../cycles/active-cycle-details.tsx | 0 .../components/cycles/active-cycle-stats.tsx | 0 .../cycles/cycles-list/all-cycles-list.tsx | 0 .../cycles-list/completed-cycles-list.tsx | 0 .../cycles/cycles-list/draft-cycles-list.tsx | 0 .../components/cycles/cycles-list/index.ts | 0 .../cycles-list/upcoming-cycles-list.tsx | 0 .../components/cycles/cycles-view.tsx | 0 .../components/cycles/delete-cycle-modal.tsx | 0 {apps/app => web}/components/cycles/form.tsx | 0 .../components/cycles/gantt-chart/blocks.tsx | 0 .../gantt-chart/cycle-issues-layout.tsx | 0 .../cycles/gantt-chart/cycles-list-layout.tsx | 0 .../components/cycles/gantt-chart/index.ts | 0 {apps/app => web}/components/cycles/index.ts | 0 {apps/app => web}/components/cycles/modal.tsx | 0 .../app => web}/components/cycles/select.tsx | 0 .../app => web}/components/cycles/sidebar.tsx | 0 .../components/cycles/single-cycle-card.tsx | 0 .../components/cycles/single-cycle-list.tsx | 0 .../cycles/transfer-issues-modal.tsx | 0 .../components/cycles/transfer-issues.tsx | 0 .../components/dnd/StrictModeDroppable.tsx | 0 .../components/emoji-icon-picker/emojis.json | 0 .../components/emoji-icon-picker/helpers.ts | 0 .../components/emoji-icon-picker/icons.json | 0 .../components/emoji-icon-picker/index.tsx | 0 .../components/emoji-icon-picker/types.d.ts | 0 .../create-update-estimate-modal.tsx | 0 .../estimates/delete-estimate-modal.tsx | 0 .../components/estimates/index.tsx | 0 .../components/estimates/single-estimate.tsx | 0 .../components/exporter/export-modal.tsx | 0 .../app => web}/components/exporter/guide.tsx | 0 .../app => web}/components/exporter/index.tsx | 0 .../components/exporter/single-export.tsx | 0 .../gantt-chart/blocks/blocks-display.tsx | 0 .../components/gantt-chart/blocks/index.ts | 0 .../components/gantt-chart/chart/bi-week.tsx | 0 .../components/gantt-chart/chart/day.tsx | 0 .../components/gantt-chart/chart/hours.tsx | 0 .../components/gantt-chart/chart/index.tsx | 0 .../components/gantt-chart/chart/month.tsx | 0 .../components/gantt-chart/chart/quarter.tsx | 0 .../components/gantt-chart/chart/week.tsx | 0 .../components/gantt-chart/chart/year.tsx | 0 .../components/gantt-chart/contexts/index.tsx | 0 .../components/gantt-chart/data/index.ts | 0 .../gantt-chart/helpers/block-structure.tsx | 0 .../gantt-chart/helpers/draggable.tsx | 0 .../components/gantt-chart/helpers/index.ts | 0 .../gantt-chart/hooks/block-update.tsx | 0 .../components/gantt-chart/hooks/index.tsx | 0 .../components/gantt-chart/index.ts | 0 .../components/gantt-chart/root.tsx | 0 .../components/gantt-chart/sidebar.tsx | 0 .../components/gantt-chart/types/index.ts | 0 .../gantt-chart/views/bi-week-view.ts | 0 .../components/gantt-chart/views/day-view.ts | 14 +- .../components/gantt-chart/views/helpers.ts | 0 .../gantt-chart/views/hours-view.ts | 14 +- .../components/gantt-chart/views/index.ts | 0 .../gantt-chart/views/month-view.ts | 0 .../gantt-chart/views/quater-view.ts | 0 .../components/gantt-chart/views/week-view.ts | 0 .../components/gantt-chart/views/year-view.ts | 0 .../components/icons/alarm-clock-icon.tsx | 0 .../components/icons/archive-icon.tsx | 0 .../components/icons/arrow-right.tsx | 0 .../icons/assignment-clipboard-icon.tsx | 0 .../components/icons/attachment-icon.tsx | 0 .../components/icons/audio-file-icon.tsx | 2 +- .../components/icons/backlog-state-icon.tsx | 0 .../components/icons/bell-icon.tsx | 0 web/components/icons/blocked-icon.tsx | 25 ++ web/components/icons/blocker-icon.tsx | 25 ++ web/components/icons/bolt-icon.tsx | 16 + .../components/icons/calendar-after-icon.tsx | 0 .../components/icons/calendar-before-icon.tsx | 0 .../components/icons/calendar-month-icon.tsx | 0 web/components/icons/cancel-icon.tsx | 16 + .../components/icons/cancelled-state-icon.tsx | 0 {apps/app => web}/components/icons/check.tsx | 0 web/components/icons/clipboard-icon.tsx | 19 + .../components/icons/clock-icon.tsx | 0 .../components/icons/cloud-upload.tsx | 0 .../app => web}/components/icons/cmd-icon.tsx | 0 {apps/app => web}/components/icons/cog.tsx | 0 .../components/icons/color-pallette-icon.tsx | 0 .../components/icons/color-picker-icon.tsx | 0 .../components/icons/command-icon.tsx | 0 web/components/icons/comment-icon.tsx | 16 + web/components/icons/completed-cycle-icon.tsx | 17 + .../components/icons/completed-state-icon.tsx | 0 .../components/icons/contrast-icon.tsx | 0 .../components/icons/css-file-icon.tsx | 2 +- .../components/icons/csv-file-icon.tsx | 2 +- web/components/icons/current-cycle-icon.tsx | 17 + .../components/icons/cycle-icon.tsx | 0 .../components/icons/default-file-icon.tsx | 2 +- .../components/icons/discord-icon.tsx | 0 .../components/icons/doc-file-icon.tsx | 2 +- .../components/icons/document-icon.tsx | 30 +- web/components/icons/edit-icon.tsx | 19 + .../icons/ellipsis-horizontal-icon.tsx | 19 + .../components/icons/exclamation-icon.tsx | 0 .../components/icons/external-link-icon.tsx | 0 .../components/icons/figma-file-icon.tsx | 2 +- .../components/icons/github-icon.tsx | 0 .../components/icons/grid-view-icons.tsx | 0 .../components/icons/heartbeat-icon.tsx | 0 .../components/icons/html-file-icon.tsx | 2 +- .../components/icons/img-file-icon.tsx | 2 +- .../components/icons/import-layers.tsx | 0 .../components/icons/inbox-icon.tsx | 0 {apps/app => web}/components/icons/index.ts | 0 .../components/icons/jpg-file-icon.tsx | 2 +- .../components/icons/js-file-icon.tsx | 2 +- .../components/icons/layer-diagonal-icon.tsx | 0 web/components/icons/lock-icon.tsx | 16 + web/components/icons/menu-icon.tsx | 19 + .../components/icons/module/backlog.tsx | 0 .../components/icons/module/cancelled.tsx | 0 .../components/icons/module/completed.tsx | 0 .../components/icons/module/in-progress.tsx | 0 .../components/icons/module/index.ts | 0 .../icons/module/module-status-icon.tsx | 0 .../components/icons/module/paused.tsx | 0 .../components/icons/module/planned.tsx | 0 .../components/icons/pdf-file-icon.tsx | 2 +- .../components/icons/pencil-scribble-icon.tsx | 0 .../components/icons/people-group-icon.tsx | 0 .../components/icons/person-running-icon.tsx | 0 web/components/icons/plus-icon.tsx | 19 + .../components/icons/png-file-icon.tsx | 2 +- .../components/icons/priority-icon.tsx | 0 .../icons/question-mark-circle-icon.tsx | 20 + .../components/icons/setting-icon.tsx | 0 .../components/icons/sheet-file-icon.tsx | 2 +- web/components/icons/signal-cellular-icon.tsx | 19 + .../components/icons/single-comment-icon.tsx | 0 .../components/icons/sort-icon.tsx | 0 .../icons/stacked-layers-horizontal-icon.tsx | 0 .../components/icons/stacked-layers-icon.tsx | 0 .../components/icons/started-state-icon.tsx | 0 .../components/icons/state-group-icon.tsx | 0 .../components/icons/svg-file-icon.tsx | 2 +- web/components/icons/tag-icon.tsx | 24 ++ .../components/icons/target-icon.tsx | 0 .../components/icons/tick-mark-icon.tsx | 0 web/components/icons/transfer-icon.tsx | 19 + .../icons/triangle-exclamation-icon.tsx | 0 web/components/icons/tune-icon.tsx | 19 + .../components/icons/txt-file-icon.tsx | 2 +- {apps/app => web}/components/icons/types.d.ts | 0 .../components/icons/unstarted-state-icon.tsx | 0 web/components/icons/upcoming-cycle-icon.tsx | 17 + .../components/icons/user-group-icon.tsx | 0 web/components/icons/user-icon-circle.tsx | 16 + web/components/icons/user-icon.tsx | 19 + {apps/app => web}/components/icons/users.tsx | 0 .../components/icons/video-file-icon.tsx | 2 +- .../components/icons/view-list-icon.tsx | 0 .../components/icons/water-drop-icon.tsx | 0 .../components/icons/x-mark-icon.tsx | 0 .../components/inbox/accept-issue-modal.tsx | 0 .../components/inbox/decline-issue-modal.tsx | 0 .../components/inbox/delete-issue-modal.tsx | 0 .../components/inbox/filters-dropdown.tsx | 0 .../components/inbox/filters-list.tsx | 0 .../components/inbox/inbox-action-headers.tsx | 0 .../components/inbox/inbox-issue-activity.tsx | 0 .../components/inbox/inbox-issue-card.tsx | 0 .../components/inbox/inbox-main-content.tsx | 0 {apps/app => web}/components/inbox/index.ts | 0 .../components/inbox/issues-list-sidebar.tsx | 0 .../components/inbox/select-duplicate.tsx | 0 .../integration/delete-import-modal.tsx | 0 .../components/integration/github/auth.tsx | 0 .../integration/github/import-configure.tsx | 0 .../integration/github/import-confirm.tsx | 0 .../integration/github/import-data.tsx | 0 .../integration/github/import-users.tsx | 0 .../components/integration/github/index.ts | 0 .../integration/github/repo-details.tsx | 0 .../components/integration/github/root.tsx | 0 .../integration/github/select-repository.tsx | 0 .../integration/github/single-user-select.tsx | 0 .../components/integration/guide.tsx | 0 .../components/integration/index.ts | 0 .../integration/jira/confirm-import.tsx | 0 .../integration/jira/give-details.tsx | 0 .../integration/jira/import-users.tsx | 0 .../components/integration/jira/index.ts | 0 .../integration/jira/jira-project-detail.tsx | 2 +- .../components/integration/jira/root.tsx | 2 +- .../components/integration/single-import.tsx | 0 .../integration/single-integration-card.tsx | 0 web/components/integration/slack/index.ts | 1 + .../integration/slack/select-channel.tsx | 0 .../components/issues/activity.tsx | 0 .../issues/attachment/attachment-upload.tsx | 0 .../issues/attachment/attachments.tsx | 0 .../attachment/delete-attachment-modal.tsx | 0 .../components/issues/attachment/index.ts | 0 .../components/issues/comment/add-comment.tsx | 0 .../issues/comment/comment-card.tsx | 0 .../issues/comment/comment-reaction.tsx | 0 .../components/issues/comment/index.ts | 0 .../components/issues/delete-issue-modal.tsx | 0 .../components/issues/description-form.tsx | 0 {apps/app => web}/components/issues/form.tsx | 0 .../components/issues/gantt-chart/blocks.tsx | 0 .../components/issues/gantt-chart/index.ts | 0 .../components/issues/gantt-chart/layout.tsx | 0 {apps/app => web}/components/issues/index.ts | 0 .../components/issues/issue-reaction.tsx | 0 {apps/app => web}/components/issues/label.tsx | 0 .../components/issues/main-content.tsx | 0 {apps/app => web}/components/issues/modal.tsx | 0 .../components/issues/my-issues/index.ts | 0 .../my-issues/my-issues-select-filters.tsx | 0 .../my-issues/my-issues-view-options.tsx | 0 .../issues/my-issues/my-issues-view.tsx | 0 .../issues/parent-issues-list-modal.tsx | 0 .../peek-overview/full-screen-peek-view.tsx | 0 .../issues/peek-overview/header.tsx | 0 .../components/issues/peek-overview/index.ts | 0 .../issues/peek-overview/issue-activity.tsx | 0 .../issues/peek-overview/issue-details.tsx | 0 .../issues/peek-overview/issue-properties.tsx | 0 .../issues/peek-overview/layout.tsx | 0 .../issues/peek-overview/side-peek-view.tsx | 0 .../components/issues/select/assignee.tsx | 0 .../components/issues/select/date.tsx | 0 .../components/issues/select/estimate.tsx | 0 .../components/issues/select/index.ts | 0 .../components/issues/select/label.tsx | 0 .../components/issues/select/priority.tsx | 0 .../components/issues/select/project.tsx | 0 .../components/issues/select/state.tsx | 0 .../issues/sidebar-select/assignee.tsx | 0 .../issues/sidebar-select/blocked.tsx | 0 .../issues/sidebar-select/blocker.tsx | 0 .../issues/sidebar-select/cycle.tsx | 0 .../issues/sidebar-select/estimate.tsx | 0 .../components/issues/sidebar-select/index.ts | 0 .../issues/sidebar-select/label.tsx | 0 .../issues/sidebar-select/module.tsx | 0 .../issues/sidebar-select/parent.tsx | 0 .../issues/sidebar-select/priority.tsx | 0 .../issues/sidebar-select/state.tsx | 0 .../app => web}/components/issues/sidebar.tsx | 0 .../components/issues/sub-issues-list.tsx | 0 .../issues/view-select/assignee.tsx | 0 .../issues/view-select/due-date.tsx | 0 .../issues/view-select/estimate.tsx | 0 .../components/issues/view-select/index.ts | 0 .../components/issues/view-select/label.tsx | 0 .../issues/view-select/priority.tsx | 0 .../issues/view-select/start-date.tsx | 0 .../components/issues/view-select/state.tsx | 0 .../components/labels/create-label-modal.tsx | 0 .../labels/create-update-label-inline.tsx | 0 .../components/labels/delete-label-modal.tsx | 0 {apps/app => web}/components/labels/index.ts | 0 .../components/labels/labels-list-modal.tsx | 0 .../components/labels/single-label-group.tsx | 0 .../components/labels/single-label.tsx | 0 .../modules/delete-module-modal.tsx | 0 {apps/app => web}/components/modules/form.tsx | 0 .../components/modules/gantt-chart/blocks.tsx | 0 .../components/modules/gantt-chart/index.ts | 0 .../gantt-chart/module-issues-layout.tsx | 0 .../gantt-chart/modules-list-layout.tsx | 0 {apps/app => web}/components/modules/index.ts | 0 .../app => web}/components/modules/modal.tsx | 0 .../components/modules/select/index.ts | 0 .../components/modules/select/lead.tsx | 0 .../components/modules/select/members.tsx | 0 .../components/modules/select/status.tsx | 0 .../modules/sidebar-select/index.ts | 0 .../modules/sidebar-select/select-lead.tsx | 0 .../modules/sidebar-select/select-members.tsx | 0 .../modules/sidebar-select/select-status.tsx | 0 .../components/modules/sidebar.tsx | 0 .../components/modules/single-module-card.tsx | 0 .../components/notifications/index.ts | 0 .../notifications/notification-card.tsx | 2 +- .../notifications/notification-header.tsx | 0 .../notifications/notification-popover.tsx | 0 .../select-snooze-till-modal.tsx | 0 .../components/onboarding/index.ts | 0 .../components/onboarding/invite-members.tsx | 0 .../components/onboarding/join-workspaces.tsx | 0 .../components/onboarding/tour/index.ts | 0 .../components/onboarding/tour/root.tsx | 0 .../components/onboarding/tour/sidebar.tsx | 0 .../components/onboarding/user-details.tsx | 0 .../components/onboarding/workspace.tsx | 0 .../components/pages/create-block.tsx | 0 .../pages/create-update-block-inline.tsx | 0 .../pages/create-update-page-modal.tsx | 0 .../components/pages/delete-page-modal.tsx | 0 {apps/app => web}/components/pages/index.ts | 0 .../components/pages/page-form.tsx | 0 .../pages/pages-list/all-pages-list.tsx | 0 .../pages/pages-list/favorite-pages-list.tsx | 0 .../components/pages/pages-list/index.ts | 0 .../pages/pages-list/my-pages-list.tsx | 0 .../pages/pages-list/other-pages-list.tsx | 0 .../pages/pages-list/recent-pages-list.tsx | 0 .../components/pages/pages-list/types.ts | 0 .../components/pages/pages-view.tsx | 0 .../components/pages/single-page-block.tsx | 0 .../pages/single-page-detailed-item.tsx | 0 .../pages/single-page-list-item.tsx | 0 {apps/app => web}/components/profile/index.ts | 0 .../app => web}/components/profile/navbar.tsx | 0 .../components/profile/overview/activity.tsx | 0 .../components/profile/overview/index.ts | 0 .../overview/priority-distribution.tsx | 0 .../profile/overview/state-distribution.tsx | 0 .../components/profile/overview/stats.tsx | 0 .../components/profile/overview/workload.tsx | 0 .../profile/profile-issues-view-options.tsx | 0 .../profile/profile-issues-view.tsx | 0 .../components/profile/sidebar.tsx | 0 .../project/confirm-project-member-remove.tsx | 0 .../project/create-project-modal.tsx | 0 .../project/delete-project-modal.tsx | 0 {apps/app => web}/components/project/index.ts | 2 +- .../components/project/join-project-modal.tsx | 0 .../project/publish-project/modal.tsx | 0 .../project/publish-project/popover.tsx | 0 .../project/send-project-invitation-modal.tsx | 0 .../components/project/settings-header.tsx | 0 .../project/settings/single-label.tsx | 0 .../components/project/sidebar-list.tsx | 0 .../project/single-integration-card.tsx | 0 .../project/single-project-card.tsx | 0 .../project/single-sidebar-project.tsx | 0 .../components/search-listbox/index.tsx | 0 .../components/search-listbox/types.d.ts | 0 .../components/states/create-state-modal.tsx | 0 .../states/create-update-state-inline.tsx | 0 .../components/states/delete-state-modal.tsx | 0 {apps/app => web}/components/states/index.ts | 0 .../components/states/single-state.tsx | 0 .../components/tiptap/bubble-menu/index.tsx | 18 +- .../tiptap/bubble-menu/link-selector.tsx | 8 +- .../tiptap/bubble-menu/node-selector.tsx | 2 +- .../bubble-menu/utils/link-validator.tsx | 1 - .../tiptap/extensions/image-resize.tsx | 19 +- .../components/tiptap/extensions/index.tsx | 11 +- .../tiptap/extensions/table/table-cell.ts | 13 +- .../tiptap/extensions/table/table-header.ts | 2 +- .../tiptap/extensions/table/table.ts | 2 +- .../tiptap/extensions/updated-image.tsx | 2 +- {apps/app => web}/components/tiptap/index.tsx | 4 +- .../tiptap/plugins/delete-image.tsx | 6 +- .../tiptap/plugins/upload-image.tsx | 15 +- {apps/app => web}/components/tiptap/props.tsx | 18 +- .../components/tiptap/slash-command/index.tsx | 269 +++++++------- .../table-menu/InsertBottomTableIcon.tsx | 16 + .../tiptap/table-menu/InsertLeftTableIcon.tsx | 15 + .../table-menu/InsertRightTableIcon.tsx | 16 + .../tiptap/table-menu/InsertTopTableIcon.tsx | 15 + .../components/tiptap/table-menu/index.tsx | 5 +- .../space => web}/components/tiptap/utils.ts | 0 .../components/toast-alert/index.tsx | 0 {apps/app => web}/components/ui/avatar.tsx | 0 .../components/ui/buttons/danger-button.tsx | 0 .../components/ui/buttons/index.ts | 0 .../components/ui/buttons/primary-button.tsx | 0 .../ui/buttons/secondary-button.tsx | 0 .../components/ui/buttons/type.d.ts | 0 .../components/ui/circular-progress.tsx | 0 {apps/app => web}/components/ui/date.tsx | 0 .../app => web}/components/ui/datepicker.tsx | 0 .../components/ui/dropdowns/context-menu.tsx | 0 .../components/ui/dropdowns/custom-menu.tsx | 0 .../ui/dropdowns/custom-search-select.tsx | 0 .../components/ui/dropdowns/custom-select.tsx | 0 .../components/ui/dropdowns/index.ts | 0 .../components/ui/dropdowns/types.d.ts | 0 .../app => web}/components/ui/empty-space.tsx | 0 .../app => web}/components/ui/empty-state.tsx | 0 .../components/ui/graphs/bar-graph.tsx | 0 .../components/ui/graphs/calendar-graph.tsx | 0 .../app => web}/components/ui/graphs/index.ts | 0 .../components/ui/graphs/line-graph.tsx | 0 .../components/ui/graphs/pie-graph.tsx | 0 .../ui/graphs/scatter-plot-graph.tsx | 0 .../components/ui/graphs/types.d.ts | 0 .../components/ui/icon-name-type.d.ts | 0 {apps/app => web}/components/ui/icon.tsx | 0 {apps/app => web}/components/ui/index.ts | 2 +- .../app => web}/components/ui/input/index.tsx | 0 .../components/ui/input/types.d.ts | 0 .../integration-and-import-export-banner.tsx | 0 .../app => web}/components/ui/labels-list.tsx | 0 .../ui/linear-progress-indicator.tsx | 17 +- {apps/space => web}/components/ui/loader.tsx | 0 .../components/ui/markdown-to-component.tsx | 0 .../components/ui/multi-level-dropdown.tsx | 0 .../components/ui/multi-level-select.tsx | 0 .../components/ui/product-updates-modal.tsx | 0 .../components/ui/profile-empty-state.tsx | 0 .../components/ui/progress-bar.tsx | 0 .../components/ui/range-datepicker.tsx | 0 {apps/app => web}/components/ui/spinner.tsx | 0 .../components/ui/text-area/index.tsx | 0 .../components/ui/text-area/types.d.ts | 0 .../components/ui/toggle-switch.tsx | 0 {apps/app => web}/components/ui/tooltip.tsx | 0 .../components/views/delete-view-modal.tsx | 5 +- {apps/app => web}/components/views/form.tsx | 0 .../components/views/gantt-chart.tsx | 0 {apps/app => web}/components/views/index.ts | 0 {apps/app => web}/components/views/modal.tsx | 0 .../components/views/select-filters.tsx | 0 .../components/views/single-view-item.tsx | 0 .../components/workspace/activity-graph.tsx | 0 .../workspace/completed-issues-graph.tsx | 0 .../confirm-workspace-member-remove.tsx | 0 .../workspace/create-workspace-form.tsx | 0 .../workspace/delete-workspace-modal.tsx | 5 +- .../components/workspace/help-section.tsx | 0 .../app => web}/components/workspace/index.ts | 0 .../components/workspace/issues-list.tsx | 0 .../components/workspace/issues-pie-chart.tsx | 0 .../components/workspace/issues-stats.tsx | 0 .../send-workspace-invitation-modal.tsx | 0 .../components/workspace/settings-header.tsx | 0 .../components/workspace/sidebar-dropdown.tsx | 0 .../components/workspace/sidebar-menu.tsx | 0 .../workspace/sidebar-quick-action.tsx | 0 .../workspace/single-invitation.tsx | 0 {apps/app => web}/constants/analytics.ts | 0 {apps/app => web}/constants/calendar.ts | 0 {apps/app => web}/constants/crisp.tsx | 0 {apps/app => web}/constants/fetch-keys.ts | 4 +- {apps/app => web}/constants/filters.ts | 0 {apps/app => web}/constants/graph.ts | 0 {apps/app => web}/constants/inbox.ts | 0 {apps/app => web}/constants/issue.ts | 0 {apps/app => web}/constants/label.ts | 0 {apps/app => web}/constants/module.ts | 0 {apps/app => web}/constants/notification.ts | 0 {apps/app => web}/constants/project.ts | 0 {apps/app => web}/constants/seo-variables.ts | 0 {apps/app => web}/constants/spreadsheet.ts | 0 {apps/app => web}/constants/state.ts | 0 {apps/app => web}/constants/themes.ts | 0 {apps/app => web}/constants/timezones.ts | 0 {apps/app => web}/constants/workspace.ts | 0 .../contexts/inbox-view-context.tsx | 0 .../contexts/issue-view.context.tsx | 0 .../contexts/profile-issues-context.tsx | 0 .../contexts/project-member.context.tsx | 0 {apps/app => web}/contexts/theme.context.tsx | 0 {apps/app => web}/contexts/toast.context.tsx | 0 .../contexts/user-notification-context.tsx | 0 {apps/app => web}/contexts/user.context.tsx | 0 .../contexts/workspace-member.context.tsx | 0 .../contexts/workspace.context.tsx | 0 {apps/app => web}/google.d.ts | 0 {apps/app => web}/helpers/analytics.helper.ts | 0 {apps/app => web}/helpers/array.helper.ts | 0 .../app => web}/helpers/attachment.helper.ts | 0 {apps/app => web}/helpers/calendar.helper.ts | 0 {apps/app => web}/helpers/color.helper.ts | 0 {apps/app => web}/helpers/common.helper.ts | 0 {apps/app => web}/helpers/date-time.helper.ts | 0 {apps/app => web}/helpers/emoji.helper.tsx | 17 +- {apps/app => web}/helpers/graph.helper.ts | 0 {apps/app => web}/helpers/state.helper.ts | 0 {apps/app => web}/helpers/string.helper.ts | 0 {apps/app => web}/helpers/theme.helper.ts | 0 .../hooks/gantt-chart/cycle-issues-view.tsx | 0 .../hooks/gantt-chart/issue-view.tsx | 0 .../hooks/gantt-chart/module-issues-view.tsx | 0 .../hooks/gantt-chart/view-issues-view.tsx | 0 .../hooks/my-issues/use-my-issues-filter.tsx | 0 .../hooks/my-issues/use-my-issues.tsx | 0 .../hooks/use-calendar-issues-view.tsx | 0 .../hooks/use-comment-reaction.tsx | 0 {apps/app => web}/hooks/use-debounce.tsx | 0 .../app => web}/hooks/use-estimate-option.tsx | 0 {apps/app => web}/hooks/use-inbox-view.tsx | 0 .../hooks/use-integration-popup.tsx | 0 .../use-issue-notification-subscription.tsx | 0 .../hooks/use-issue-properties.tsx | 2 +- .../app => web}/hooks/use-issue-reaction.tsx | 0 {apps/app => web}/hooks/use-issues-view.tsx | 0 {apps/app => web}/hooks/use-local-storage.tsx | 0 .../hooks/use-outside-click-detector.tsx | 0 .../app => web}/hooks/use-profile-issues.tsx | 0 .../app => web}/hooks/use-project-details.tsx | 0 .../app => web}/hooks/use-project-members.tsx | 0 {apps/app => web}/hooks/use-projects.tsx | 0 .../hooks/use-reload-confirmation.tsx | 0 .../hooks/use-spreadsheet-issues-view.tsx | 0 {apps/app => web}/hooks/use-sub-issue.tsx | 0 {apps/app => web}/hooks/use-theme.tsx | 0 {apps/space => web}/hooks/use-timer.tsx | 0 {apps/space => web}/hooks/use-toast.tsx | 0 {apps/app => web}/hooks/use-user-auth.tsx | 0 .../hooks/use-user-notifications.tsx | 0 {apps/app => web}/hooks/use-user.tsx | 0 .../hooks/use-workspace-details.tsx | 0 .../hooks/use-workspace-members.tsx | 0 {apps/app => web}/hooks/use-workspaces.tsx | 0 .../layouts/app-layout/app-header.tsx | 0 .../layouts/app-layout/app-sidebar.tsx | 0 .../app => web}/layouts/auth-layout/index.ts | 0 .../project-authorization-wrapper.tsx | 0 .../user-authorization-wrapper.tsx | 0 .../workspace-authorization-wrapper.tsx | 0 .../layouts/default-layout/index.tsx | 0 {apps/app => web}/layouts/profile-layout.tsx | 0 {apps/app => web}/layouts/settings-navbar.tsx | 0 {apps/app => web}/lib/auth.ts | 0 {apps/app => web}/lib/cookie.ts | 0 {apps/app => web}/lib/mobx/store-init.tsx | 0 .../space => web}/lib/mobx/store-provider.tsx | 0 {apps/app => web}/lib/redirect.ts | 0 {apps/app => web}/manifest.json | 0 {apps/app => web}/next-env.d.ts | 0 {apps/app => web}/next.config.js | 2 +- {apps/app => web}/package.json | 2 +- {apps/app => web}/pages/404.tsx | 0 .../pages/[workspaceSlug]/analytics.tsx | 0 .../pages/[workspaceSlug]/editor.tsx | 0 .../pages/[workspaceSlug]/index.tsx | 0 .../pages/[workspaceSlug]/me/my-issues.tsx | 0 .../[workspaceSlug]/me/profile/activity.tsx | 0 .../[workspaceSlug]/me/profile/index.tsx | 0 .../me/profile/preferences.tsx | 0 .../profile/[userId]/assigned.tsx | 0 .../profile/[userId]/created.tsx | 0 .../profile/[userId]/index.tsx | 0 .../profile/[userId]/subscribed.tsx | 0 .../archived-issues/[archivedIssueId].tsx | 0 .../[projectId]/archived-issues/index.tsx | 0 .../projects/[projectId]/cycles/[cycleId].tsx | 0 .../projects/[projectId]/cycles/index.tsx | 0 .../projects/[projectId]/inbox/[inboxId].tsx | 0 .../projects/[projectId]/issues/[issueId].tsx | 0 .../projects/[projectId]/issues/index.tsx | 0 .../[projectId]/modules/[moduleId].tsx | 0 .../projects/[projectId]/modules/index.tsx | 0 .../projects/[projectId]/pages/[pageId].tsx | 0 .../projects/[projectId]/pages/index.tsx | 0 .../[projectId]/settings/automations.tsx | 0 .../projects/[projectId]/settings/control.tsx | 0 .../[projectId]/settings/estimates.tsx | 0 .../[projectId]/settings/features.tsx | 0 .../projects/[projectId]/settings/index.tsx | 0 .../[projectId]/settings/integrations.tsx | 0 .../projects/[projectId]/settings/labels.tsx | 0 .../projects/[projectId]/settings/members.tsx | 0 .../projects/[projectId]/settings/states.tsx | 0 .../projects/[projectId]/views/[viewId].tsx | 0 .../projects/[projectId]/views/index.tsx | 0 .../pages/[workspaceSlug]/projects/index.tsx | 0 .../[workspaceSlug]/settings/billing.tsx | 0 .../[workspaceSlug]/settings/exports.tsx | 0 .../[workspaceSlug]/settings/imports.tsx | 0 .../pages/[workspaceSlug]/settings/index.tsx | 10 +- .../[workspaceSlug]/settings/integrations.tsx | 0 .../[workspaceSlug]/settings/members.tsx | 0 {apps/app => web}/pages/_app.tsx | 0 {apps/app => web}/pages/_document.tsx | 0 {apps/app => web}/pages/_error.tsx | 0 {apps/app => web}/pages/api/slack-redirect.ts | 2 +- {apps/app => web}/pages/api/track-event.ts | 0 {apps/app => web}/pages/api/unsplash.ts | 0 {apps/app => web}/pages/create-workspace.tsx | 0 {apps/app => web}/pages/error.tsx | 0 {apps/app => web}/pages/index.tsx | 0 .../pages/installations/[provider]/index.tsx | 0 {apps/app => web}/pages/invitations.tsx | 0 {apps/app => web}/pages/magic-sign-in.tsx | 0 {apps/app => web}/pages/onboarding.tsx | 0 {apps/app => web}/pages/reset-password.tsx | 0 {apps/app => web}/pages/sign-up.tsx | 0 .../pages/workspace-member-invitation.tsx | 0 {apps/space => web}/postcss.config.js | 0 {apps/space => web}/public/404.svg | 0 .../public/animated-icons/uploading.json | 0 .../public/attachment/audio-icon.png | Bin .../public/attachment/css-icon.png | Bin .../public/attachment/csv-icon.png | Bin .../public/attachment/default-icon.png | Bin .../public/attachment/doc-icon.png | Bin .../public/attachment/excel-icon.png | Bin .../public/attachment/figma-icon.png | Bin .../public/attachment/html-icon.png | Bin .../public/attachment/img-icon.png | Bin .../public/attachment/jpg-icon.png | Bin .../app => web}/public/attachment/js-icon.png | Bin .../public/attachment/pdf-icon.png | Bin .../public/attachment/png-icon.png | Bin .../public/attachment/svg-icon.png | Bin .../public/attachment/txt-icon.png | Bin .../public/attachment/video-icon.png | Bin .../public/auth/project-not-authorized.svg | 0 .../public/auth/workspace-not-authorized.svg | 0 .../public/empty-state/analytics.svg | 0 .../app => web}/public/empty-state/cycle.svg | 0 .../public/empty-state/dashboard.svg | 0 .../public/empty-state/empty_bar_graph.svg | 0 .../public/empty-state/empty_graph.svg | 0 .../public/empty-state/empty_users.svg | 0 .../public/empty-state/estimate.svg | 0 .../public/empty-state/integration.svg | 0 .../public/empty-state/invitation.svg | 0 .../public/empty-state/issue-archive.svg | 0 .../app => web}/public/empty-state/issue.svg | 0 .../app => web}/public/empty-state/label.svg | 0 .../app => web}/public/empty-state/module.svg | 0 .../public/empty-state/my-issues.svg | 0 .../public/empty-state/notification.svg | 0 {apps/app => web}/public/empty-state/page.svg | 0 .../public/empty-state/project.svg | 0 .../public/empty-state/recent_activity.svg | 0 .../public/empty-state/state_graph.svg | 0 {apps/app => web}/public/empty-state/view.svg | 0 .../public/favicon/android-chrome-192x192.png | Bin .../public/favicon/android-chrome-512x512.png | Bin .../public/favicon/apple-touch-icon.png | Bin .../public/favicon/favicon-16x16.png | Bin .../public/favicon/favicon-32x32.png | Bin .../space => web}/public/favicon/favicon.ico | Bin .../public/favicon/site.webmanifest | 0 .../app => web}/public/logos/github-black.png | Bin .../public/logos/github-square.png | Bin .../app => web}/public/logos/github-white.png | Bin {apps/app => web}/public/mac-command.svg | 0 .../app => web}/public/onboarding/cycles.svg | 0 .../app => web}/public/onboarding/cycles.webp | Bin .../app => web}/public/onboarding/issues.svg | 0 .../app => web}/public/onboarding/issues.webp | Bin .../app => web}/public/onboarding/modules.svg | 0 .../public/onboarding/modules.webp | Bin {apps/app => web}/public/onboarding/pages.svg | 0 .../app => web}/public/onboarding/pages.webp | Bin {apps/app => web}/public/onboarding/views.svg | 0 .../app => web}/public/onboarding/views.webp | Bin .../black-horizontal-with-blue-logo.svg | 0 .../public/plane-logos/blue-without-text.png | Bin .../white-horizontal-with-blue-logo.svg | 0 .../public/plane-logos/white-horizontal.svg | 0 {apps/app => web}/public/services/csv.svg | 0 {apps/app => web}/public/services/excel.svg | 0 {apps/app => web}/public/services/github.png | Bin {apps/app => web}/public/services/jira.png | Bin {apps/app => web}/public/services/json.svg | 0 {apps/app => web}/public/services/slack.png | Bin .../app => web}/public/site.webmanifest.json | 0 {apps/app => web}/public/sw.js | 0 {apps/app => web}/public/sw.js.map | 0 {apps/app => web}/public/user.png | Bin {apps/app => web}/public/workbox-7805bd61.js | 0 .../public/workbox-7805bd61.js.map | 0 {apps/app => web}/sentry.client.config.js | 0 {apps/app => web}/sentry.edge.config.js | 0 {apps/app => web}/sentry.properties | 0 {apps/app => web}/sentry.server.config.js | 0 {apps/app => web}/services/ai.service.ts | 0 .../app => web}/services/analytics.service.ts | 0 {apps/app => web}/services/api.service.ts | 0 .../services/app-installations.service.ts | 20 +- .../services/authentication.service.ts | 0 {apps/app => web}/services/cycles.service.ts | 0 .../app => web}/services/estimates.service.ts | 0 {apps/app => web}/services/file.service.ts | 0 {apps/app => web}/services/inbox.service.ts | 0 .../services/integration/csv.services.ts | 0 .../services/integration/github.service.ts | 0 .../app => web}/services/integration/index.ts | 0 .../services/integration/jira.service.ts | 0 {apps/app => web}/services/issues.service.ts | 0 {apps/app => web}/services/modules.service.ts | 11 +- .../services/notifications.service.ts | 0 {apps/app => web}/services/pages.service.ts | 0 .../services/project-publish.service.ts | 0 {apps/app => web}/services/project.service.ts | 0 .../app => web}/services/reaction.service.ts | 0 {apps/app => web}/services/state.service.ts | 0 .../services/track-event.service.ts | 0 {apps/app => web}/services/user.service.ts | 0 {apps/app => web}/services/views.service.ts | 0 .../services/web-waitlist.service.ts | 0 .../app => web}/services/workspace.service.ts | 0 {apps/app => web}/store/issues.ts | 0 {apps/app => web}/store/project-publish.tsx | 0 {apps/app => web}/store/root.ts | 0 {apps/app => web}/store/theme.ts | 0 {apps/app => web}/store/user.ts | 0 {apps/app => web}/styles/command-pallette.css | 0 {apps/space => web}/styles/editor.css | 0 {apps/app => web}/styles/globals.css | 0 {apps/app => web}/styles/nprogress.css | 0 {apps/app => web}/styles/react-datepicker.css | 0 {apps/app => web}/tailwind.config.js | 0 web/tsconfig.json | 9 + {apps/app => web}/types/ai.d.ts | 0 {apps/app => web}/types/analytics.d.ts | 0 {apps/app => web}/types/calendar.ts | 0 {apps/app => web}/types/cycles.d.ts | 0 {apps/app => web}/types/estimate.d.ts | 0 .../types/importer/github-importer.d.ts | 0 {apps/app => web}/types/importer/index.ts | 0 .../types/importer/jira-importer.d.ts | 0 {apps/app => web}/types/inbox.d.ts | 0 {apps/app => web}/types/index.d.ts | 1 - {apps/app => web}/types/integration.d.ts | 0 {apps/app => web}/types/issues.d.ts | 0 {apps/app => web}/types/modules.d.ts | 0 {apps/app => web}/types/notifications.d.ts | 0 {apps/app => web}/types/pages.d.ts | 0 {apps/app => web}/types/projects.d.ts | 2 +- {apps/app => web}/types/reaction.d.ts | 0 {apps/app => web}/types/state.d.ts | 0 {apps/app => web}/types/users.d.ts | 2 +- {apps/app => web}/types/views.d.ts | 0 {apps/app => web}/types/waitlist.d.ts | 0 {apps/app => web}/types/workspace.d.ts | 0 yarn.lock | 56 ++- 1022 files changed, 1475 insertions(+), 1240 deletions(-) create mode 100644 .gitpod.yml delete mode 100644 apps/app/components/icons/blocked-icon.tsx delete mode 100644 apps/app/components/icons/blocker-icon.tsx delete mode 100644 apps/app/components/icons/bolt-icon.tsx delete mode 100644 apps/app/components/icons/cancel-icon.tsx delete mode 100644 apps/app/components/icons/clipboard-icon.tsx delete mode 100644 apps/app/components/icons/comment-icon.tsx delete mode 100644 apps/app/components/icons/completed-cycle-icon.tsx delete mode 100644 apps/app/components/icons/current-cycle-icon.tsx delete mode 100644 apps/app/components/icons/edit-icon.tsx delete mode 100644 apps/app/components/icons/ellipsis-horizontal-icon.tsx delete mode 100644 apps/app/components/icons/lock-icon.tsx delete mode 100644 apps/app/components/icons/menu-icon.tsx delete mode 100644 apps/app/components/icons/plus-icon.tsx delete mode 100644 apps/app/components/icons/question-mark-circle-icon.tsx delete mode 100644 apps/app/components/icons/signal-cellular-icon.tsx delete mode 100644 apps/app/components/icons/tag-icon.tsx delete mode 100644 apps/app/components/icons/transfer-icon.tsx delete mode 100644 apps/app/components/icons/tune-icon.tsx delete mode 100644 apps/app/components/icons/upcoming-cycle-icon.tsx delete mode 100644 apps/app/components/icons/user-icon-circle.tsx delete mode 100644 apps/app/components/icons/user-icon.tsx delete mode 100644 apps/app/components/integration/slack/index.ts delete mode 100644 apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx delete mode 100644 apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx delete mode 100644 apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx delete mode 100644 apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx delete mode 100644 apps/space/public/logos/github-black.png delete mode 100644 apps/space/public/logos/github-square.png delete mode 100644 apps/space/public/logos/github-white.png delete mode 100644 apps/space/public/plane-logo.webp delete mode 100644 apps/space/public/plane-logos/blue-without-text.png delete mode 100644 apps/space/tsconfig.json rename {apps/space => space}/.env.example (100%) rename {apps/app => space}/.eslintrc.js (100%) rename {apps/space => space}/.gitignore (100%) rename {apps/space => space}/.prettierignore (100%) rename {apps/space => space}/.prettierrc.json (100%) rename {apps/space => space}/Dockerfile.space (81%) rename {apps/space => space}/README.md (100%) rename {apps/space => space}/components/accounts/email-code-form.tsx (100%) rename {apps/space => space}/components/accounts/email-password-form.tsx (100%) rename {apps/space => space}/components/accounts/email-reset-password-form.tsx (100%) rename {apps/space => space}/components/accounts/github-login-button.tsx (93%) rename {apps/space => space}/components/accounts/google-login.tsx (100%) rename {apps/space => space}/components/accounts/index.ts (100%) rename {apps/space => space}/components/accounts/onboarding-form.tsx (100%) rename {apps/space => space}/components/icons/index.ts (100%) rename {apps/space => space}/components/icons/issue-group/backlog-state-icon.tsx (100%) rename {apps/space => space}/components/icons/issue-group/cancelled-state-icon.tsx (100%) rename {apps/space => space}/components/icons/issue-group/completed-state-icon.tsx (100%) rename {apps/space => space}/components/icons/issue-group/started-state-icon.tsx (100%) rename {apps/space => space}/components/icons/issue-group/unstarted-state-icon.tsx (100%) rename {apps/space => space}/components/icons/types.d.ts (100%) rename {apps/space => space}/components/issues/board-views/block-downvotes.tsx (100%) rename {apps/space => space}/components/issues/board-views/block-due-date.tsx (100%) rename {apps/space => space}/components/issues/board-views/block-labels.tsx (100%) rename {apps/space => space}/components/issues/board-views/block-priority.tsx (100%) rename {apps/space => space}/components/issues/board-views/block-state.tsx (100%) rename {apps/space => space}/components/issues/board-views/block-upvotes.tsx (100%) rename {apps/space => space}/components/issues/board-views/calendar/index.tsx (100%) rename {apps/space => space}/components/issues/board-views/gantt/index.tsx (100%) rename {apps/space => space}/components/issues/board-views/kanban/block.tsx (98%) rename {apps/space => space}/components/issues/board-views/kanban/header.tsx (100%) rename {apps/space => space}/components/issues/board-views/kanban/index.tsx (100%) rename {apps/space => space}/components/issues/board-views/list/block.tsx (98%) rename {apps/space => space}/components/issues/board-views/list/header.tsx (100%) rename {apps/space => space}/components/issues/board-views/list/index.tsx (100%) rename {apps/space => space}/components/issues/board-views/spreadsheet/index.tsx (100%) rename {apps/space => space}/components/issues/filters-render/index.tsx (100%) rename {apps/space => space}/components/issues/filters-render/label/filter-label-block.tsx (100%) rename {apps/space => space}/components/issues/filters-render/label/index.tsx (100%) rename {apps/space => space}/components/issues/filters-render/priority/filter-priority-block.tsx (100%) rename {apps/space => space}/components/issues/filters-render/priority/index.tsx (100%) rename {apps/space => space}/components/issues/filters-render/state/filter-state-block.tsx (100%) rename {apps/space => space}/components/issues/filters-render/state/index.tsx (100%) rename {apps/space => space}/components/issues/navbar/index.tsx (100%) rename {apps/space => space}/components/issues/navbar/issue-board-view.tsx (100%) rename {apps/space => space}/components/issues/navbar/issue-filter.tsx (100%) rename {apps/space => space}/components/issues/navbar/issue-view.tsx (100%) rename {apps/space => space}/components/issues/navbar/search.tsx (100%) rename {apps/space => space}/components/issues/navbar/theme.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/add-comment.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/comment-detail-card.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/full-screen-peek-view.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/header.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/index.ts (100%) rename {apps/space => space}/components/issues/peek-overview/issue-activity.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/issue-details.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/issue-emoji-reactions.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/issue-properties.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/issue-reaction.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/issue-vote-reactions.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/layout.tsx (100%) rename {apps/space => space}/components/issues/peek-overview/side-peek-view.tsx (100%) rename {apps/space => space}/components/tiptap/bubble-menu/index.tsx (100%) rename {apps/app => space}/components/tiptap/bubble-menu/link-selector.tsx (92%) rename {apps/app => space}/components/tiptap/bubble-menu/node-selector.tsx (92%) rename {apps/app => space}/components/tiptap/bubble-menu/utils/link-validator.tsx (99%) rename {apps/app => space}/components/tiptap/extensions/image-resize.tsx (78%) rename {apps/space => space}/components/tiptap/extensions/index.tsx (93%) rename {apps/app => space}/components/tiptap/extensions/updated-image.tsx (95%) rename {apps/space => space}/components/tiptap/index.tsx (96%) rename {apps/space => space}/components/tiptap/plugins/delete-image.tsx (90%) rename {apps/space => space}/components/tiptap/plugins/upload-image.tsx (80%) rename {apps/space => space}/components/tiptap/props.tsx (77%) rename {apps/space => space}/components/tiptap/slash-command/index.tsx (53%) rename {apps/app => space}/components/tiptap/utils.ts (100%) rename {apps/space => space}/components/ui/dropdown.tsx (100%) rename {apps/space => space}/components/ui/icon.tsx (100%) rename {apps/space => space}/components/ui/index.ts (100%) rename {apps/space => space}/components/ui/input.tsx (100%) rename {apps/app => space}/components/ui/loader.tsx (100%) rename {apps/space => space}/components/ui/primary-button.tsx (100%) rename {apps/space => space}/components/ui/reaction-selector.tsx (100%) rename {apps/space => space}/components/ui/secondary-button.tsx (100%) rename {apps/space => space}/components/ui/toast-alert.tsx (100%) rename {apps/space => space}/components/ui/tooltip.tsx (100%) rename {apps/space => space}/components/views/project-details.tsx (100%) rename {apps/space => space}/constants/data.ts (100%) rename {apps/space => space}/constants/helpers.ts (100%) rename {apps/space => space}/constants/seo.ts (100%) rename {apps/space => space}/constants/workspace.ts (100%) rename {apps/space => space}/contexts/toast.context.tsx (100%) rename {apps/space => space}/helpers/date-time.helper.ts (100%) rename {apps/space => space}/helpers/emoji.helper.tsx (100%) rename {apps/space => space}/helpers/string.helper.ts (100%) rename {apps/space => space}/hooks/use-outside-click.tsx (100%) rename {apps/app => space}/hooks/use-timer.tsx (100%) rename {apps/app => space}/hooks/use-toast.tsx (100%) rename {apps/space => space}/layouts/project-layout.tsx (84%) rename {apps/space => space}/lib/index.ts (100%) rename {apps/space => space}/lib/mobx/store-init.tsx (100%) rename {apps/app => space}/lib/mobx/store-provider.tsx (100%) rename {apps/space => space}/next.config.js (55%) rename {apps/space => space}/package.json (95%) rename {apps/space => space}/pages/404.tsx (90%) rename {apps/space => space}/pages/[workspace_slug]/[project_slug]/index.tsx (100%) rename {apps/space => space}/pages/[workspace_slug]/index.tsx (92%) rename {apps/space => space}/pages/_app.tsx (75%) rename {apps/space => space}/pages/_document.tsx (100%) rename {apps/space => space}/pages/index.tsx (99%) rename {apps/space => space}/pages/onboarding/index.tsx (95%) rename {apps/space => space}/pages/project-not-published/index.tsx (87%) rename {apps/app => space}/postcss.config.js (100%) rename {apps/app => space}/public/404.svg (100%) rename {apps/app => space}/public/favicon/android-chrome-192x192.png (100%) rename {apps/app => space}/public/favicon/android-chrome-512x512.png (100%) rename {apps/app => space}/public/favicon/apple-touch-icon.png (100%) rename {apps/app => space}/public/favicon/favicon-16x16.png (100%) rename {apps/app => space}/public/favicon/favicon-32x32.png (100%) rename {apps/app => space}/public/favicon/favicon.ico (100%) rename {apps/app => space}/public/favicon/site.webmanifest (100%) create mode 100644 space/public/logos/github-black.svg create mode 100644 space/public/logos/github-square.svg create mode 100644 space/public/logos/github-white.svg create mode 100644 space/public/plane-logo.svg rename {apps/app => space}/public/plane-logos/black-horizontal-with-blue-logo.svg (100%) create mode 100644 space/public/plane-logos/blue-without-text.svg rename {apps/app => space}/public/plane-logos/white-horizontal-with-blue-logo.svg (100%) rename {apps/app => space}/public/plane-logos/white-horizontal.svg (100%) rename {apps/space => space}/public/project-not-published.svg (100%) rename {apps/space => space}/services/api.service.ts (100%) rename {apps/space => space}/services/authentication.service.ts (100%) rename {apps/space => space}/services/file.service.ts (100%) rename {apps/space => space}/services/issue.service.ts (100%) rename {apps/space => space}/services/project.service.ts (100%) rename {apps/space => space}/services/user.service.ts (100%) rename {apps/space => space}/store/issue.ts (100%) rename {apps/space => space}/store/issue_details.ts (100%) rename {apps/space => space}/store/project.ts (100%) rename {apps/space => space}/store/root.ts (100%) rename {apps/space => space}/store/user.ts (100%) rename {apps/app => space}/styles/editor.css (100%) rename {apps/space => space}/styles/globals.css (100%) rename {apps/space => space}/tailwind.config.js (100%) rename {apps/app => space}/tsconfig.json (100%) rename {apps/space => space}/types/issue.ts (100%) rename {apps/space => space}/types/project.ts (100%) rename {apps/space => space}/types/theme.ts (100%) rename {apps/space => space}/types/user.ts (100%) create mode 100644 web/.eslintrc.js rename {apps/app => web}/.prettierrc (100%) rename {apps/app => web}/Dockerfile.dev (100%) rename {apps/app => web}/Dockerfile.web (81%) rename {apps/app => web}/components/account/email-code-form.tsx (100%) rename {apps/app => web}/components/account/email-password-form.tsx (100%) rename {apps/app => web}/components/account/email-reset-password-form.tsx (100%) rename {apps/app => web}/components/account/github-login-button.tsx (100%) rename {apps/app => web}/components/account/google-login.tsx (100%) rename {apps/app => web}/components/account/index.ts (100%) rename {apps/app => web}/components/analytics/custom-analytics/create-update-analytics-modal.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/custom-analytics.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/graph/custom-tooltip.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/graph/index.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/index.ts (100%) rename {apps/app => web}/components/analytics/custom-analytics/select-bar.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/sidebar.tsx (100%) rename {apps/app => web}/components/analytics/custom-analytics/table.tsx (100%) rename {apps/app => web}/components/analytics/index.ts (100%) rename {apps/app => web}/components/analytics/project-modal.tsx (100%) rename {apps/app => web}/components/analytics/scope-and-demand/demand.tsx (100%) rename {apps/app => web}/components/analytics/scope-and-demand/index.ts (100%) rename {apps/app => web}/components/analytics/scope-and-demand/leaderboard.tsx (100%) rename {apps/app => web}/components/analytics/scope-and-demand/scope-and-demand.tsx (100%) rename {apps/app => web}/components/analytics/scope-and-demand/scope.tsx (100%) rename {apps/app => web}/components/analytics/scope-and-demand/year-wise-issues.tsx (100%) rename {apps/app => web}/components/analytics/select/index.ts (100%) rename {apps/app => web}/components/analytics/select/project.tsx (100%) rename {apps/app => web}/components/analytics/select/segment.tsx (100%) rename {apps/app => web}/components/analytics/select/x-axis.tsx (100%) rename {apps/app => web}/components/analytics/select/y-axis.tsx (100%) rename {apps/app => web}/components/auth-screens/index.ts (100%) rename {apps/app => web}/components/auth-screens/not-authorized-view.tsx (100%) rename {apps/app => web}/components/auth-screens/project/index.ts (100%) rename {apps/app => web}/components/auth-screens/project/join-project.tsx (100%) rename {apps/app => web}/components/auth-screens/workspace/index.ts (100%) rename {apps/app => web}/components/auth-screens/workspace/not-a-member.tsx (100%) rename {apps/app => web}/components/automation/auto-archive-automation.tsx (100%) rename {apps/app => web}/components/automation/auto-close-automation.tsx (100%) rename {apps/app => web}/components/automation/index.ts (100%) rename {apps/app => web}/components/automation/select-month-modal.tsx (100%) rename {apps/app => web}/components/breadcrumbs/index.tsx (100%) rename {apps/app => web}/components/command-palette/change-interface-theme.tsx (100%) rename {apps/app => web}/components/command-palette/command-k.tsx (100%) rename {apps/app => web}/components/command-palette/command-pallette.tsx (80%) rename {apps/app => web}/components/command-palette/helpers.tsx (100%) rename {apps/app => web}/components/command-palette/index.ts (100%) rename {apps/app => web}/components/command-palette/issue/change-issue-assignee.tsx (100%) rename {apps/app => web}/components/command-palette/issue/change-issue-priority.tsx (100%) rename {apps/app => web}/components/command-palette/issue/change-issue-state.tsx (100%) rename {apps/app => web}/components/command-palette/issue/index.ts (100%) rename {apps/app => web}/components/command-palette/shortcuts-modal.tsx (100%) rename {apps/app => web}/components/core/activity.tsx (100%) rename {apps/app => web}/components/core/filters/date-filter-modal.tsx (100%) rename {apps/app => web}/components/core/filters/date-filter-select.tsx (100%) rename {apps/app => web}/components/core/filters/filters-list.tsx (100%) rename {apps/app => web}/components/core/filters/index.ts (100%) rename {apps/app => web}/components/core/filters/issues-view-filter.tsx (100%) rename {apps/app => web}/components/core/image-picker-popover.tsx (100%) rename {apps/app => web}/components/core/index.ts (100%) rename {apps/app => web}/components/core/modals/bulk-delete-issues-modal.tsx (100%) rename {apps/app => web}/components/core/modals/existing-issues-list-modal.tsx (100%) rename {apps/app => web}/components/core/modals/gpt-assistant-modal.tsx (100%) rename {apps/app => web}/components/core/modals/image-upload-modal.tsx (100%) rename {apps/app => web}/components/core/modals/index.ts (100%) rename {apps/app => web}/components/core/modals/link-modal.tsx (100%) rename {apps/app => web}/components/core/reaction-selector.tsx (100%) rename {apps/app => web}/components/core/sidebar/index.ts (100%) rename {apps/app => web}/components/core/sidebar/links-list.tsx (100%) rename {apps/app => web}/components/core/sidebar/progress-chart.tsx (100%) rename {apps/app => web}/components/core/sidebar/sidebar-progress-stats.tsx (100%) rename {apps/app => web}/components/core/sidebar/single-progress-stats.tsx (100%) rename {apps/app => web}/components/core/theme/color-picker-input.tsx (100%) rename {apps/app => web}/components/core/theme/custom-theme-selector.tsx (100%) rename {apps/app => web}/components/core/theme/index.ts (100%) rename {apps/app => web}/components/core/theme/theme-switch.tsx (100%) rename {apps/app => web}/components/core/views/all-views.tsx (100%) rename {apps/app => web}/components/core/views/board-view/all-boards.tsx (100%) rename {apps/app => web}/components/core/views/board-view/board-header.tsx (100%) rename {apps/app => web}/components/core/views/board-view/index.ts (100%) rename {apps/app => web}/components/core/views/board-view/single-board.tsx (100%) rename {apps/app => web}/components/core/views/board-view/single-issue.tsx (100%) rename {apps/app => web}/components/core/views/calendar-view/calendar-header.tsx (100%) rename {apps/app => web}/components/core/views/calendar-view/calendar.tsx (100%) rename {apps/app => web}/components/core/views/calendar-view/index.ts (100%) rename {apps/app => web}/components/core/views/calendar-view/single-date.tsx (100%) rename {apps/app => web}/components/core/views/calendar-view/single-issue.tsx (100%) rename {apps/app => web}/components/core/views/gantt-chart-view/index.tsx (100%) rename {apps/app => web}/components/core/views/index.ts (100%) rename {apps/app => web}/components/core/views/issues-view.tsx (100%) rename {apps/app => web}/components/core/views/list-view/all-lists.tsx (100%) rename {apps/app => web}/components/core/views/list-view/index.ts (100%) rename {apps/app => web}/components/core/views/list-view/single-issue.tsx (100%) rename {apps/app => web}/components/core/views/list-view/single-list.tsx (100%) rename {apps/app => web}/components/core/views/spreadsheet-view/index.ts (100%) rename {apps/app => web}/components/core/views/spreadsheet-view/single-issue.tsx (100%) rename {apps/app => web}/components/core/views/spreadsheet-view/spreadsheet-columns.tsx (100%) rename {apps/app => web}/components/core/views/spreadsheet-view/spreadsheet-issues.tsx (100%) rename {apps/app => web}/components/core/views/spreadsheet-view/spreadsheet-view.tsx (100%) rename {apps/app => web}/components/cycles/active-cycle-details.tsx (100%) rename {apps/app => web}/components/cycles/active-cycle-stats.tsx (100%) rename {apps/app => web}/components/cycles/cycles-list/all-cycles-list.tsx (100%) rename {apps/app => web}/components/cycles/cycles-list/completed-cycles-list.tsx (100%) rename {apps/app => web}/components/cycles/cycles-list/draft-cycles-list.tsx (100%) rename {apps/app => web}/components/cycles/cycles-list/index.ts (100%) rename {apps/app => web}/components/cycles/cycles-list/upcoming-cycles-list.tsx (100%) rename {apps/app => web}/components/cycles/cycles-view.tsx (100%) rename {apps/app => web}/components/cycles/delete-cycle-modal.tsx (100%) rename {apps/app => web}/components/cycles/form.tsx (100%) rename {apps/app => web}/components/cycles/gantt-chart/blocks.tsx (100%) rename {apps/app => web}/components/cycles/gantt-chart/cycle-issues-layout.tsx (100%) rename {apps/app => web}/components/cycles/gantt-chart/cycles-list-layout.tsx (100%) rename {apps/app => web}/components/cycles/gantt-chart/index.ts (100%) rename {apps/app => web}/components/cycles/index.ts (100%) rename {apps/app => web}/components/cycles/modal.tsx (100%) rename {apps/app => web}/components/cycles/select.tsx (100%) rename {apps/app => web}/components/cycles/sidebar.tsx (100%) rename {apps/app => web}/components/cycles/single-cycle-card.tsx (100%) rename {apps/app => web}/components/cycles/single-cycle-list.tsx (100%) rename {apps/app => web}/components/cycles/transfer-issues-modal.tsx (100%) rename {apps/app => web}/components/cycles/transfer-issues.tsx (100%) rename {apps/app => web}/components/dnd/StrictModeDroppable.tsx (100%) rename {apps/app => web}/components/emoji-icon-picker/emojis.json (100%) rename {apps/app => web}/components/emoji-icon-picker/helpers.ts (100%) rename {apps/app => web}/components/emoji-icon-picker/icons.json (100%) rename {apps/app => web}/components/emoji-icon-picker/index.tsx (100%) rename {apps/app => web}/components/emoji-icon-picker/types.d.ts (100%) rename {apps/app => web}/components/estimates/create-update-estimate-modal.tsx (100%) rename {apps/app => web}/components/estimates/delete-estimate-modal.tsx (100%) rename {apps/app => web}/components/estimates/index.tsx (100%) rename {apps/app => web}/components/estimates/single-estimate.tsx (100%) rename {apps/app => web}/components/exporter/export-modal.tsx (100%) rename {apps/app => web}/components/exporter/guide.tsx (100%) rename {apps/app => web}/components/exporter/index.tsx (100%) rename {apps/app => web}/components/exporter/single-export.tsx (100%) rename {apps/app => web}/components/gantt-chart/blocks/blocks-display.tsx (100%) rename {apps/app => web}/components/gantt-chart/blocks/index.ts (100%) rename {apps/app => web}/components/gantt-chart/chart/bi-week.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/day.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/hours.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/index.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/month.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/quarter.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/week.tsx (100%) rename {apps/app => web}/components/gantt-chart/chart/year.tsx (100%) rename {apps/app => web}/components/gantt-chart/contexts/index.tsx (100%) rename {apps/app => web}/components/gantt-chart/data/index.ts (100%) rename {apps/app => web}/components/gantt-chart/helpers/block-structure.tsx (100%) rename {apps/app => web}/components/gantt-chart/helpers/draggable.tsx (100%) rename {apps/app => web}/components/gantt-chart/helpers/index.ts (100%) rename {apps/app => web}/components/gantt-chart/hooks/block-update.tsx (100%) rename {apps/app => web}/components/gantt-chart/hooks/index.tsx (100%) rename {apps/app => web}/components/gantt-chart/index.ts (100%) rename {apps/app => web}/components/gantt-chart/root.tsx (100%) rename {apps/app => web}/components/gantt-chart/sidebar.tsx (100%) rename {apps/app => web}/components/gantt-chart/types/index.ts (100%) rename {apps/app => web}/components/gantt-chart/views/bi-week-view.ts (100%) rename {apps/app => web}/components/gantt-chart/views/day-view.ts (93%) rename {apps/app => web}/components/gantt-chart/views/helpers.ts (100%) rename {apps/app => web}/components/gantt-chart/views/hours-view.ts (93%) rename {apps/app => web}/components/gantt-chart/views/index.ts (100%) rename {apps/app => web}/components/gantt-chart/views/month-view.ts (100%) rename {apps/app => web}/components/gantt-chart/views/quater-view.ts (100%) rename {apps/app => web}/components/gantt-chart/views/week-view.ts (100%) rename {apps/app => web}/components/gantt-chart/views/year-view.ts (100%) rename {apps/app => web}/components/icons/alarm-clock-icon.tsx (100%) rename {apps/app => web}/components/icons/archive-icon.tsx (100%) rename {apps/app => web}/components/icons/arrow-right.tsx (100%) rename {apps/app => web}/components/icons/assignment-clipboard-icon.tsx (100%) rename {apps/app => web}/components/icons/attachment-icon.tsx (100%) rename {apps/app => web}/components/icons/audio-file-icon.tsx (78%) rename {apps/app => web}/components/icons/backlog-state-icon.tsx (100%) rename {apps/app => web}/components/icons/bell-icon.tsx (100%) create mode 100644 web/components/icons/blocked-icon.tsx create mode 100644 web/components/icons/blocker-icon.tsx create mode 100644 web/components/icons/bolt-icon.tsx rename {apps/app => web}/components/icons/calendar-after-icon.tsx (100%) rename {apps/app => web}/components/icons/calendar-before-icon.tsx (100%) rename {apps/app => web}/components/icons/calendar-month-icon.tsx (100%) create mode 100644 web/components/icons/cancel-icon.tsx rename {apps/app => web}/components/icons/cancelled-state-icon.tsx (100%) rename {apps/app => web}/components/icons/check.tsx (100%) create mode 100644 web/components/icons/clipboard-icon.tsx rename {apps/app => web}/components/icons/clock-icon.tsx (100%) rename {apps/app => web}/components/icons/cloud-upload.tsx (100%) rename {apps/app => web}/components/icons/cmd-icon.tsx (100%) rename {apps/app => web}/components/icons/cog.tsx (100%) rename {apps/app => web}/components/icons/color-pallette-icon.tsx (100%) rename {apps/app => web}/components/icons/color-picker-icon.tsx (100%) rename {apps/app => web}/components/icons/command-icon.tsx (100%) create mode 100644 web/components/icons/comment-icon.tsx create mode 100644 web/components/icons/completed-cycle-icon.tsx rename {apps/app => web}/components/icons/completed-state-icon.tsx (100%) rename {apps/app => web}/components/icons/contrast-icon.tsx (100%) rename {apps/app => web}/components/icons/css-file-icon.tsx (78%) rename {apps/app => web}/components/icons/csv-file-icon.tsx (78%) create mode 100644 web/components/icons/current-cycle-icon.tsx rename {apps/app => web}/components/icons/cycle-icon.tsx (100%) rename {apps/app => web}/components/icons/default-file-icon.tsx (78%) rename {apps/app => web}/components/icons/discord-icon.tsx (100%) rename {apps/app => web}/components/icons/doc-file-icon.tsx (78%) rename {apps/app => web}/components/icons/document-icon.tsx (82%) create mode 100644 web/components/icons/edit-icon.tsx create mode 100644 web/components/icons/ellipsis-horizontal-icon.tsx rename {apps/app => web}/components/icons/exclamation-icon.tsx (100%) rename {apps/app => web}/components/icons/external-link-icon.tsx (100%) rename {apps/app => web}/components/icons/figma-file-icon.tsx (78%) rename {apps/app => web}/components/icons/github-icon.tsx (100%) rename {apps/app => web}/components/icons/grid-view-icons.tsx (100%) rename {apps/app => web}/components/icons/heartbeat-icon.tsx (100%) rename {apps/app => web}/components/icons/html-file-icon.tsx (78%) rename {apps/app => web}/components/icons/img-file-icon.tsx (78%) rename {apps/app => web}/components/icons/import-layers.tsx (100%) rename {apps/app => web}/components/icons/inbox-icon.tsx (100%) rename {apps/app => web}/components/icons/index.ts (100%) rename {apps/app => web}/components/icons/jpg-file-icon.tsx (78%) rename {apps/app => web}/components/icons/js-file-icon.tsx (97%) rename {apps/app => web}/components/icons/layer-diagonal-icon.tsx (100%) create mode 100644 web/components/icons/lock-icon.tsx create mode 100644 web/components/icons/menu-icon.tsx rename {apps/app => web}/components/icons/module/backlog.tsx (100%) rename {apps/app => web}/components/icons/module/cancelled.tsx (100%) rename {apps/app => web}/components/icons/module/completed.tsx (100%) rename {apps/app => web}/components/icons/module/in-progress.tsx (100%) rename {apps/app => web}/components/icons/module/index.ts (100%) rename {apps/app => web}/components/icons/module/module-status-icon.tsx (100%) rename {apps/app => web}/components/icons/module/paused.tsx (100%) rename {apps/app => web}/components/icons/module/planned.tsx (100%) rename {apps/app => web}/components/icons/pdf-file-icon.tsx (78%) rename {apps/app => web}/components/icons/pencil-scribble-icon.tsx (100%) rename {apps/app => web}/components/icons/people-group-icon.tsx (100%) rename {apps/app => web}/components/icons/person-running-icon.tsx (100%) create mode 100644 web/components/icons/plus-icon.tsx rename {apps/app => web}/components/icons/png-file-icon.tsx (78%) rename {apps/app => web}/components/icons/priority-icon.tsx (100%) create mode 100644 web/components/icons/question-mark-circle-icon.tsx rename {apps/app => web}/components/icons/setting-icon.tsx (100%) rename {apps/app => web}/components/icons/sheet-file-icon.tsx (78%) create mode 100644 web/components/icons/signal-cellular-icon.tsx rename {apps/app => web}/components/icons/single-comment-icon.tsx (100%) rename {apps/app => web}/components/icons/sort-icon.tsx (100%) rename {apps/app => web}/components/icons/stacked-layers-horizontal-icon.tsx (100%) rename {apps/app => web}/components/icons/stacked-layers-icon.tsx (100%) rename {apps/app => web}/components/icons/started-state-icon.tsx (100%) rename {apps/app => web}/components/icons/state-group-icon.tsx (100%) rename {apps/app => web}/components/icons/svg-file-icon.tsx (78%) create mode 100644 web/components/icons/tag-icon.tsx rename {apps/app => web}/components/icons/target-icon.tsx (100%) rename {apps/app => web}/components/icons/tick-mark-icon.tsx (100%) create mode 100644 web/components/icons/transfer-icon.tsx rename {apps/app => web}/components/icons/triangle-exclamation-icon.tsx (100%) create mode 100644 web/components/icons/tune-icon.tsx rename {apps/app => web}/components/icons/txt-file-icon.tsx (78%) rename {apps/app => web}/components/icons/types.d.ts (100%) rename {apps/app => web}/components/icons/unstarted-state-icon.tsx (100%) create mode 100644 web/components/icons/upcoming-cycle-icon.tsx rename {apps/app => web}/components/icons/user-group-icon.tsx (100%) create mode 100644 web/components/icons/user-icon-circle.tsx create mode 100644 web/components/icons/user-icon.tsx rename {apps/app => web}/components/icons/users.tsx (100%) rename {apps/app => web}/components/icons/video-file-icon.tsx (78%) rename {apps/app => web}/components/icons/view-list-icon.tsx (100%) rename {apps/app => web}/components/icons/water-drop-icon.tsx (100%) rename {apps/app => web}/components/icons/x-mark-icon.tsx (100%) rename {apps/app => web}/components/inbox/accept-issue-modal.tsx (100%) rename {apps/app => web}/components/inbox/decline-issue-modal.tsx (100%) rename {apps/app => web}/components/inbox/delete-issue-modal.tsx (100%) rename {apps/app => web}/components/inbox/filters-dropdown.tsx (100%) rename {apps/app => web}/components/inbox/filters-list.tsx (100%) rename {apps/app => web}/components/inbox/inbox-action-headers.tsx (100%) rename {apps/app => web}/components/inbox/inbox-issue-activity.tsx (100%) rename {apps/app => web}/components/inbox/inbox-issue-card.tsx (100%) rename {apps/app => web}/components/inbox/inbox-main-content.tsx (100%) rename {apps/app => web}/components/inbox/index.ts (100%) rename {apps/app => web}/components/inbox/issues-list-sidebar.tsx (100%) rename {apps/app => web}/components/inbox/select-duplicate.tsx (100%) rename {apps/app => web}/components/integration/delete-import-modal.tsx (100%) rename {apps/app => web}/components/integration/github/auth.tsx (100%) rename {apps/app => web}/components/integration/github/import-configure.tsx (100%) rename {apps/app => web}/components/integration/github/import-confirm.tsx (100%) rename {apps/app => web}/components/integration/github/import-data.tsx (100%) rename {apps/app => web}/components/integration/github/import-users.tsx (100%) rename {apps/app => web}/components/integration/github/index.ts (100%) rename {apps/app => web}/components/integration/github/repo-details.tsx (100%) rename {apps/app => web}/components/integration/github/root.tsx (100%) rename {apps/app => web}/components/integration/github/select-repository.tsx (100%) rename {apps/app => web}/components/integration/github/single-user-select.tsx (100%) rename {apps/app => web}/components/integration/guide.tsx (100%) rename {apps/app => web}/components/integration/index.ts (100%) rename {apps/app => web}/components/integration/jira/confirm-import.tsx (100%) rename {apps/app => web}/components/integration/jira/give-details.tsx (100%) rename {apps/app => web}/components/integration/jira/import-users.tsx (100%) rename {apps/app => web}/components/integration/jira/index.ts (100%) rename {apps/app => web}/components/integration/jira/jira-project-detail.tsx (99%) rename {apps/app => web}/components/integration/jira/root.tsx (99%) rename {apps/app => web}/components/integration/single-import.tsx (100%) rename {apps/app => web}/components/integration/single-integration-card.tsx (100%) create mode 100644 web/components/integration/slack/index.ts rename {apps/app => web}/components/integration/slack/select-channel.tsx (100%) rename {apps/app => web}/components/issues/activity.tsx (100%) rename {apps/app => web}/components/issues/attachment/attachment-upload.tsx (100%) rename {apps/app => web}/components/issues/attachment/attachments.tsx (100%) rename {apps/app => web}/components/issues/attachment/delete-attachment-modal.tsx (100%) rename {apps/app => web}/components/issues/attachment/index.ts (100%) rename {apps/app => web}/components/issues/comment/add-comment.tsx (100%) rename {apps/app => web}/components/issues/comment/comment-card.tsx (100%) rename {apps/app => web}/components/issues/comment/comment-reaction.tsx (100%) rename {apps/app => web}/components/issues/comment/index.ts (100%) rename {apps/app => web}/components/issues/delete-issue-modal.tsx (100%) rename {apps/app => web}/components/issues/description-form.tsx (100%) rename {apps/app => web}/components/issues/form.tsx (100%) rename {apps/app => web}/components/issues/gantt-chart/blocks.tsx (100%) rename {apps/app => web}/components/issues/gantt-chart/index.ts (100%) rename {apps/app => web}/components/issues/gantt-chart/layout.tsx (100%) rename {apps/app => web}/components/issues/index.ts (100%) rename {apps/app => web}/components/issues/issue-reaction.tsx (100%) rename {apps/app => web}/components/issues/label.tsx (100%) rename {apps/app => web}/components/issues/main-content.tsx (100%) rename {apps/app => web}/components/issues/modal.tsx (100%) rename {apps/app => web}/components/issues/my-issues/index.ts (100%) rename {apps/app => web}/components/issues/my-issues/my-issues-select-filters.tsx (100%) rename {apps/app => web}/components/issues/my-issues/my-issues-view-options.tsx (100%) rename {apps/app => web}/components/issues/my-issues/my-issues-view.tsx (100%) rename {apps/app => web}/components/issues/parent-issues-list-modal.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/full-screen-peek-view.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/header.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/index.ts (100%) rename {apps/app => web}/components/issues/peek-overview/issue-activity.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/issue-details.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/issue-properties.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/layout.tsx (100%) rename {apps/app => web}/components/issues/peek-overview/side-peek-view.tsx (100%) rename {apps/app => web}/components/issues/select/assignee.tsx (100%) rename {apps/app => web}/components/issues/select/date.tsx (100%) rename {apps/app => web}/components/issues/select/estimate.tsx (100%) rename {apps/app => web}/components/issues/select/index.ts (100%) rename {apps/app => web}/components/issues/select/label.tsx (100%) rename {apps/app => web}/components/issues/select/priority.tsx (100%) rename {apps/app => web}/components/issues/select/project.tsx (100%) rename {apps/app => web}/components/issues/select/state.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/assignee.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/blocked.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/blocker.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/cycle.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/estimate.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/index.ts (100%) rename {apps/app => web}/components/issues/sidebar-select/label.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/module.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/parent.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/priority.tsx (100%) rename {apps/app => web}/components/issues/sidebar-select/state.tsx (100%) rename {apps/app => web}/components/issues/sidebar.tsx (100%) rename {apps/app => web}/components/issues/sub-issues-list.tsx (100%) rename {apps/app => web}/components/issues/view-select/assignee.tsx (100%) rename {apps/app => web}/components/issues/view-select/due-date.tsx (100%) rename {apps/app => web}/components/issues/view-select/estimate.tsx (100%) rename {apps/app => web}/components/issues/view-select/index.ts (100%) rename {apps/app => web}/components/issues/view-select/label.tsx (100%) rename {apps/app => web}/components/issues/view-select/priority.tsx (100%) rename {apps/app => web}/components/issues/view-select/start-date.tsx (100%) rename {apps/app => web}/components/issues/view-select/state.tsx (100%) rename {apps/app => web}/components/labels/create-label-modal.tsx (100%) rename {apps/app => web}/components/labels/create-update-label-inline.tsx (100%) rename {apps/app => web}/components/labels/delete-label-modal.tsx (100%) rename {apps/app => web}/components/labels/index.ts (100%) rename {apps/app => web}/components/labels/labels-list-modal.tsx (100%) rename {apps/app => web}/components/labels/single-label-group.tsx (100%) rename {apps/app => web}/components/labels/single-label.tsx (100%) rename {apps/app => web}/components/modules/delete-module-modal.tsx (100%) rename {apps/app => web}/components/modules/form.tsx (100%) rename {apps/app => web}/components/modules/gantt-chart/blocks.tsx (100%) rename {apps/app => web}/components/modules/gantt-chart/index.ts (100%) rename {apps/app => web}/components/modules/gantt-chart/module-issues-layout.tsx (100%) rename {apps/app => web}/components/modules/gantt-chart/modules-list-layout.tsx (100%) rename {apps/app => web}/components/modules/index.ts (100%) rename {apps/app => web}/components/modules/modal.tsx (100%) rename {apps/app => web}/components/modules/select/index.ts (100%) rename {apps/app => web}/components/modules/select/lead.tsx (100%) rename {apps/app => web}/components/modules/select/members.tsx (100%) rename {apps/app => web}/components/modules/select/status.tsx (100%) rename {apps/app => web}/components/modules/sidebar-select/index.ts (100%) rename {apps/app => web}/components/modules/sidebar-select/select-lead.tsx (100%) rename {apps/app => web}/components/modules/sidebar-select/select-members.tsx (100%) rename {apps/app => web}/components/modules/sidebar-select/select-status.tsx (100%) rename {apps/app => web}/components/modules/sidebar.tsx (100%) rename {apps/app => web}/components/modules/single-module-card.tsx (100%) rename {apps/app => web}/components/notifications/index.ts (100%) rename {apps/app => web}/components/notifications/notification-card.tsx (99%) rename {apps/app => web}/components/notifications/notification-header.tsx (100%) rename {apps/app => web}/components/notifications/notification-popover.tsx (100%) rename {apps/app => web}/components/notifications/select-snooze-till-modal.tsx (100%) rename {apps/app => web}/components/onboarding/index.ts (100%) rename {apps/app => web}/components/onboarding/invite-members.tsx (100%) rename {apps/app => web}/components/onboarding/join-workspaces.tsx (100%) rename {apps/app => web}/components/onboarding/tour/index.ts (100%) rename {apps/app => web}/components/onboarding/tour/root.tsx (100%) rename {apps/app => web}/components/onboarding/tour/sidebar.tsx (100%) rename {apps/app => web}/components/onboarding/user-details.tsx (100%) rename {apps/app => web}/components/onboarding/workspace.tsx (100%) rename {apps/app => web}/components/pages/create-block.tsx (100%) rename {apps/app => web}/components/pages/create-update-block-inline.tsx (100%) rename {apps/app => web}/components/pages/create-update-page-modal.tsx (100%) rename {apps/app => web}/components/pages/delete-page-modal.tsx (100%) rename {apps/app => web}/components/pages/index.ts (100%) rename {apps/app => web}/components/pages/page-form.tsx (100%) rename {apps/app => web}/components/pages/pages-list/all-pages-list.tsx (100%) rename {apps/app => web}/components/pages/pages-list/favorite-pages-list.tsx (100%) rename {apps/app => web}/components/pages/pages-list/index.ts (100%) rename {apps/app => web}/components/pages/pages-list/my-pages-list.tsx (100%) rename {apps/app => web}/components/pages/pages-list/other-pages-list.tsx (100%) rename {apps/app => web}/components/pages/pages-list/recent-pages-list.tsx (100%) rename {apps/app => web}/components/pages/pages-list/types.ts (100%) rename {apps/app => web}/components/pages/pages-view.tsx (100%) rename {apps/app => web}/components/pages/single-page-block.tsx (100%) rename {apps/app => web}/components/pages/single-page-detailed-item.tsx (100%) rename {apps/app => web}/components/pages/single-page-list-item.tsx (100%) rename {apps/app => web}/components/profile/index.ts (100%) rename {apps/app => web}/components/profile/navbar.tsx (100%) rename {apps/app => web}/components/profile/overview/activity.tsx (100%) rename {apps/app => web}/components/profile/overview/index.ts (100%) rename {apps/app => web}/components/profile/overview/priority-distribution.tsx (100%) rename {apps/app => web}/components/profile/overview/state-distribution.tsx (100%) rename {apps/app => web}/components/profile/overview/stats.tsx (100%) rename {apps/app => web}/components/profile/overview/workload.tsx (100%) rename {apps/app => web}/components/profile/profile-issues-view-options.tsx (100%) rename {apps/app => web}/components/profile/profile-issues-view.tsx (100%) rename {apps/app => web}/components/profile/sidebar.tsx (100%) rename {apps/app => web}/components/project/confirm-project-member-remove.tsx (100%) rename {apps/app => web}/components/project/create-project-modal.tsx (100%) rename {apps/app => web}/components/project/delete-project-modal.tsx (100%) rename {apps/app => web}/components/project/index.ts (87%) rename {apps/app => web}/components/project/join-project-modal.tsx (100%) rename {apps/app => web}/components/project/publish-project/modal.tsx (100%) rename {apps/app => web}/components/project/publish-project/popover.tsx (100%) rename {apps/app => web}/components/project/send-project-invitation-modal.tsx (100%) rename {apps/app => web}/components/project/settings-header.tsx (100%) rename {apps/app => web}/components/project/settings/single-label.tsx (100%) rename {apps/app => web}/components/project/sidebar-list.tsx (100%) rename {apps/app => web}/components/project/single-integration-card.tsx (100%) rename {apps/app => web}/components/project/single-project-card.tsx (100%) rename {apps/app => web}/components/project/single-sidebar-project.tsx (100%) rename {apps/app => web}/components/search-listbox/index.tsx (100%) rename {apps/app => web}/components/search-listbox/types.d.ts (100%) rename {apps/app => web}/components/states/create-state-modal.tsx (100%) rename {apps/app => web}/components/states/create-update-state-inline.tsx (100%) rename {apps/app => web}/components/states/delete-state-modal.tsx (100%) rename {apps/app => web}/components/states/index.ts (100%) rename {apps/app => web}/components/states/single-state.tsx (100%) rename {apps/app => web}/components/tiptap/bubble-menu/index.tsx (91%) rename {apps/space => web}/components/tiptap/bubble-menu/link-selector.tsx (92%) rename {apps/space => web}/components/tiptap/bubble-menu/node-selector.tsx (98%) rename {apps/space => web}/components/tiptap/bubble-menu/utils/link-validator.tsx (99%) rename {apps/space => web}/components/tiptap/extensions/image-resize.tsx (78%) rename {apps/app => web}/components/tiptap/extensions/index.tsx (94%) rename {apps/app => web}/components/tiptap/extensions/table/table-cell.ts (67%) rename {apps/app => web}/components/tiptap/extensions/table/table-header.ts (86%) rename {apps/app => web}/components/tiptap/extensions/table/table.ts (83%) rename {apps/space => web}/components/tiptap/extensions/updated-image.tsx (95%) rename {apps/app => web}/components/tiptap/index.tsx (96%) rename {apps/app => web}/components/tiptap/plugins/delete-image.tsx (90%) rename {apps/app => web}/components/tiptap/plugins/upload-image.tsx (90%) rename {apps/app => web}/components/tiptap/props.tsx (83%) rename {apps/app => web}/components/tiptap/slash-command/index.tsx (52%) create mode 100644 web/components/tiptap/table-menu/InsertBottomTableIcon.tsx create mode 100644 web/components/tiptap/table-menu/InsertLeftTableIcon.tsx create mode 100644 web/components/tiptap/table-menu/InsertRightTableIcon.tsx create mode 100644 web/components/tiptap/table-menu/InsertTopTableIcon.tsx rename {apps/app => web}/components/tiptap/table-menu/index.tsx (97%) rename {apps/space => web}/components/tiptap/utils.ts (100%) rename {apps/app => web}/components/toast-alert/index.tsx (100%) rename {apps/app => web}/components/ui/avatar.tsx (100%) rename {apps/app => web}/components/ui/buttons/danger-button.tsx (100%) rename {apps/app => web}/components/ui/buttons/index.ts (100%) rename {apps/app => web}/components/ui/buttons/primary-button.tsx (100%) rename {apps/app => web}/components/ui/buttons/secondary-button.tsx (100%) rename {apps/app => web}/components/ui/buttons/type.d.ts (100%) rename {apps/app => web}/components/ui/circular-progress.tsx (100%) rename {apps/app => web}/components/ui/date.tsx (100%) rename {apps/app => web}/components/ui/datepicker.tsx (100%) rename {apps/app => web}/components/ui/dropdowns/context-menu.tsx (100%) rename {apps/app => web}/components/ui/dropdowns/custom-menu.tsx (100%) rename {apps/app => web}/components/ui/dropdowns/custom-search-select.tsx (100%) rename {apps/app => web}/components/ui/dropdowns/custom-select.tsx (100%) rename {apps/app => web}/components/ui/dropdowns/index.ts (100%) rename {apps/app => web}/components/ui/dropdowns/types.d.ts (100%) rename {apps/app => web}/components/ui/empty-space.tsx (100%) rename {apps/app => web}/components/ui/empty-state.tsx (100%) rename {apps/app => web}/components/ui/graphs/bar-graph.tsx (100%) rename {apps/app => web}/components/ui/graphs/calendar-graph.tsx (100%) rename {apps/app => web}/components/ui/graphs/index.ts (100%) rename {apps/app => web}/components/ui/graphs/line-graph.tsx (100%) rename {apps/app => web}/components/ui/graphs/pie-graph.tsx (100%) rename {apps/app => web}/components/ui/graphs/scatter-plot-graph.tsx (100%) rename {apps/app => web}/components/ui/graphs/types.d.ts (100%) rename {apps/app => web}/components/ui/icon-name-type.d.ts (100%) rename {apps/app => web}/components/ui/icon.tsx (100%) rename {apps/app => web}/components/ui/index.ts (95%) rename {apps/app => web}/components/ui/input/index.tsx (100%) rename {apps/app => web}/components/ui/input/types.d.ts (100%) rename {apps/app => web}/components/ui/integration-and-import-export-banner.tsx (100%) rename {apps/app => web}/components/ui/labels-list.tsx (100%) rename {apps/app => web}/components/ui/linear-progress-indicator.tsx (73%) rename {apps/space => web}/components/ui/loader.tsx (100%) rename {apps/app => web}/components/ui/markdown-to-component.tsx (100%) rename {apps/app => web}/components/ui/multi-level-dropdown.tsx (100%) rename {apps/app => web}/components/ui/multi-level-select.tsx (100%) rename {apps/app => web}/components/ui/product-updates-modal.tsx (100%) rename {apps/app => web}/components/ui/profile-empty-state.tsx (100%) rename {apps/app => web}/components/ui/progress-bar.tsx (100%) rename {apps/app => web}/components/ui/range-datepicker.tsx (100%) rename {apps/app => web}/components/ui/spinner.tsx (100%) rename {apps/app => web}/components/ui/text-area/index.tsx (100%) rename {apps/app => web}/components/ui/text-area/types.d.ts (100%) rename {apps/app => web}/components/ui/toggle-switch.tsx (100%) rename {apps/app => web}/components/ui/tooltip.tsx (100%) rename {apps/app => web}/components/views/delete-view-modal.tsx (97%) rename {apps/app => web}/components/views/form.tsx (100%) rename {apps/app => web}/components/views/gantt-chart.tsx (100%) rename {apps/app => web}/components/views/index.ts (100%) rename {apps/app => web}/components/views/modal.tsx (100%) rename {apps/app => web}/components/views/select-filters.tsx (100%) rename {apps/app => web}/components/views/single-view-item.tsx (100%) rename {apps/app => web}/components/workspace/activity-graph.tsx (100%) rename {apps/app => web}/components/workspace/completed-issues-graph.tsx (100%) rename {apps/app => web}/components/workspace/confirm-workspace-member-remove.tsx (100%) rename {apps/app => web}/components/workspace/create-workspace-form.tsx (100%) rename {apps/app => web}/components/workspace/delete-workspace-modal.tsx (97%) rename {apps/app => web}/components/workspace/help-section.tsx (100%) rename {apps/app => web}/components/workspace/index.ts (100%) rename {apps/app => web}/components/workspace/issues-list.tsx (100%) rename {apps/app => web}/components/workspace/issues-pie-chart.tsx (100%) rename {apps/app => web}/components/workspace/issues-stats.tsx (100%) rename {apps/app => web}/components/workspace/send-workspace-invitation-modal.tsx (100%) rename {apps/app => web}/components/workspace/settings-header.tsx (100%) rename {apps/app => web}/components/workspace/sidebar-dropdown.tsx (100%) rename {apps/app => web}/components/workspace/sidebar-menu.tsx (100%) rename {apps/app => web}/components/workspace/sidebar-quick-action.tsx (100%) rename {apps/app => web}/components/workspace/single-invitation.tsx (100%) rename {apps/app => web}/constants/analytics.ts (100%) rename {apps/app => web}/constants/calendar.ts (100%) rename {apps/app => web}/constants/crisp.tsx (100%) rename {apps/app => web}/constants/fetch-keys.ts (99%) rename {apps/app => web}/constants/filters.ts (100%) rename {apps/app => web}/constants/graph.ts (100%) rename {apps/app => web}/constants/inbox.ts (100%) rename {apps/app => web}/constants/issue.ts (100%) rename {apps/app => web}/constants/label.ts (100%) rename {apps/app => web}/constants/module.ts (100%) rename {apps/app => web}/constants/notification.ts (100%) rename {apps/app => web}/constants/project.ts (100%) rename {apps/app => web}/constants/seo-variables.ts (100%) rename {apps/app => web}/constants/spreadsheet.ts (100%) rename {apps/app => web}/constants/state.ts (100%) rename {apps/app => web}/constants/themes.ts (100%) rename {apps/app => web}/constants/timezones.ts (100%) rename {apps/app => web}/constants/workspace.ts (100%) rename {apps/app => web}/contexts/inbox-view-context.tsx (100%) rename {apps/app => web}/contexts/issue-view.context.tsx (100%) rename {apps/app => web}/contexts/profile-issues-context.tsx (100%) rename {apps/app => web}/contexts/project-member.context.tsx (100%) rename {apps/app => web}/contexts/theme.context.tsx (100%) rename {apps/app => web}/contexts/toast.context.tsx (100%) rename {apps/app => web}/contexts/user-notification-context.tsx (100%) rename {apps/app => web}/contexts/user.context.tsx (100%) rename {apps/app => web}/contexts/workspace-member.context.tsx (100%) rename {apps/app => web}/contexts/workspace.context.tsx (100%) rename {apps/app => web}/google.d.ts (100%) rename {apps/app => web}/helpers/analytics.helper.ts (100%) rename {apps/app => web}/helpers/array.helper.ts (100%) rename {apps/app => web}/helpers/attachment.helper.ts (100%) rename {apps/app => web}/helpers/calendar.helper.ts (100%) rename {apps/app => web}/helpers/color.helper.ts (100%) rename {apps/app => web}/helpers/common.helper.ts (100%) rename {apps/app => web}/helpers/date-time.helper.ts (100%) rename {apps/app => web}/helpers/emoji.helper.tsx (77%) rename {apps/app => web}/helpers/graph.helper.ts (100%) rename {apps/app => web}/helpers/state.helper.ts (100%) rename {apps/app => web}/helpers/string.helper.ts (100%) rename {apps/app => web}/helpers/theme.helper.ts (100%) rename {apps/app => web}/hooks/gantt-chart/cycle-issues-view.tsx (100%) rename {apps/app => web}/hooks/gantt-chart/issue-view.tsx (100%) rename {apps/app => web}/hooks/gantt-chart/module-issues-view.tsx (100%) rename {apps/app => web}/hooks/gantt-chart/view-issues-view.tsx (100%) rename {apps/app => web}/hooks/my-issues/use-my-issues-filter.tsx (100%) rename {apps/app => web}/hooks/my-issues/use-my-issues.tsx (100%) rename {apps/app => web}/hooks/use-calendar-issues-view.tsx (100%) rename {apps/app => web}/hooks/use-comment-reaction.tsx (100%) rename {apps/app => web}/hooks/use-debounce.tsx (100%) rename {apps/app => web}/hooks/use-estimate-option.tsx (100%) rename {apps/app => web}/hooks/use-inbox-view.tsx (100%) rename {apps/app => web}/hooks/use-integration-popup.tsx (100%) rename {apps/app => web}/hooks/use-issue-notification-subscription.tsx (100%) rename {apps/app => web}/hooks/use-issue-properties.tsx (98%) rename {apps/app => web}/hooks/use-issue-reaction.tsx (100%) rename {apps/app => web}/hooks/use-issues-view.tsx (100%) rename {apps/app => web}/hooks/use-local-storage.tsx (100%) rename {apps/app => web}/hooks/use-outside-click-detector.tsx (100%) rename {apps/app => web}/hooks/use-profile-issues.tsx (100%) rename {apps/app => web}/hooks/use-project-details.tsx (100%) rename {apps/app => web}/hooks/use-project-members.tsx (100%) rename {apps/app => web}/hooks/use-projects.tsx (100%) rename {apps/app => web}/hooks/use-reload-confirmation.tsx (100%) rename {apps/app => web}/hooks/use-spreadsheet-issues-view.tsx (100%) rename {apps/app => web}/hooks/use-sub-issue.tsx (100%) rename {apps/app => web}/hooks/use-theme.tsx (100%) rename {apps/space => web}/hooks/use-timer.tsx (100%) rename {apps/space => web}/hooks/use-toast.tsx (100%) rename {apps/app => web}/hooks/use-user-auth.tsx (100%) rename {apps/app => web}/hooks/use-user-notifications.tsx (100%) rename {apps/app => web}/hooks/use-user.tsx (100%) rename {apps/app => web}/hooks/use-workspace-details.tsx (100%) rename {apps/app => web}/hooks/use-workspace-members.tsx (100%) rename {apps/app => web}/hooks/use-workspaces.tsx (100%) rename {apps/app => web}/layouts/app-layout/app-header.tsx (100%) rename {apps/app => web}/layouts/app-layout/app-sidebar.tsx (100%) rename {apps/app => web}/layouts/auth-layout/index.ts (100%) rename {apps/app => web}/layouts/auth-layout/project-authorization-wrapper.tsx (100%) rename {apps/app => web}/layouts/auth-layout/user-authorization-wrapper.tsx (100%) rename {apps/app => web}/layouts/auth-layout/workspace-authorization-wrapper.tsx (100%) rename {apps/app => web}/layouts/default-layout/index.tsx (100%) rename {apps/app => web}/layouts/profile-layout.tsx (100%) rename {apps/app => web}/layouts/settings-navbar.tsx (100%) rename {apps/app => web}/lib/auth.ts (100%) rename {apps/app => web}/lib/cookie.ts (100%) rename {apps/app => web}/lib/mobx/store-init.tsx (100%) rename {apps/space => web}/lib/mobx/store-provider.tsx (100%) rename {apps/app => web}/lib/redirect.ts (100%) rename {apps/app => web}/manifest.json (100%) rename {apps/app => web}/next-env.d.ts (100%) rename {apps/app => web}/next.config.js (94%) rename {apps/app => web}/package.json (99%) rename {apps/app => web}/pages/404.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/analytics.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/editor.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/me/my-issues.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/me/profile/activity.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/me/profile/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/me/profile/preferences.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/profile/[userId]/assigned.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/profile/[userId]/created.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/profile/[userId]/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/profile/[userId]/subscribed.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/archived-issues/[archivedIssueId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/archived-issues/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/cycles/[cycleId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/inbox/[inboxId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/issues/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/modules/[moduleId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/pages/[pageId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/pages/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/automations.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/control.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/estimates.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/features.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/integrations.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/labels.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/members.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/settings/states.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/views/[viewId].tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/projects/index.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/settings/billing.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/settings/exports.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/settings/imports.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/settings/index.tsx (97%) rename {apps/app => web}/pages/[workspaceSlug]/settings/integrations.tsx (100%) rename {apps/app => web}/pages/[workspaceSlug]/settings/members.tsx (100%) rename {apps/app => web}/pages/_app.tsx (100%) rename {apps/app => web}/pages/_document.tsx (100%) rename {apps/app => web}/pages/_error.tsx (100%) rename {apps/app => web}/pages/api/slack-redirect.ts (94%) rename {apps/app => web}/pages/api/track-event.ts (100%) rename {apps/app => web}/pages/api/unsplash.ts (100%) rename {apps/app => web}/pages/create-workspace.tsx (100%) rename {apps/app => web}/pages/error.tsx (100%) rename {apps/app => web}/pages/index.tsx (100%) rename {apps/app => web}/pages/installations/[provider]/index.tsx (100%) rename {apps/app => web}/pages/invitations.tsx (100%) rename {apps/app => web}/pages/magic-sign-in.tsx (100%) rename {apps/app => web}/pages/onboarding.tsx (100%) rename {apps/app => web}/pages/reset-password.tsx (100%) rename {apps/app => web}/pages/sign-up.tsx (100%) rename {apps/app => web}/pages/workspace-member-invitation.tsx (100%) rename {apps/space => web}/postcss.config.js (100%) rename {apps/space => web}/public/404.svg (100%) rename {apps/app => web}/public/animated-icons/uploading.json (100%) rename {apps/app => web}/public/attachment/audio-icon.png (100%) rename {apps/app => web}/public/attachment/css-icon.png (100%) rename {apps/app => web}/public/attachment/csv-icon.png (100%) rename {apps/app => web}/public/attachment/default-icon.png (100%) rename {apps/app => web}/public/attachment/doc-icon.png (100%) rename {apps/app => web}/public/attachment/excel-icon.png (100%) rename {apps/app => web}/public/attachment/figma-icon.png (100%) rename {apps/app => web}/public/attachment/html-icon.png (100%) rename {apps/app => web}/public/attachment/img-icon.png (100%) rename {apps/app => web}/public/attachment/jpg-icon.png (100%) rename {apps/app => web}/public/attachment/js-icon.png (100%) rename {apps/app => web}/public/attachment/pdf-icon.png (100%) rename {apps/app => web}/public/attachment/png-icon.png (100%) rename {apps/app => web}/public/attachment/svg-icon.png (100%) rename {apps/app => web}/public/attachment/txt-icon.png (100%) rename {apps/app => web}/public/attachment/video-icon.png (100%) rename {apps/app => web}/public/auth/project-not-authorized.svg (100%) rename {apps/app => web}/public/auth/workspace-not-authorized.svg (100%) rename {apps/app => web}/public/empty-state/analytics.svg (100%) rename {apps/app => web}/public/empty-state/cycle.svg (100%) rename {apps/app => web}/public/empty-state/dashboard.svg (100%) rename {apps/app => web}/public/empty-state/empty_bar_graph.svg (100%) rename {apps/app => web}/public/empty-state/empty_graph.svg (100%) rename {apps/app => web}/public/empty-state/empty_users.svg (100%) rename {apps/app => web}/public/empty-state/estimate.svg (100%) rename {apps/app => web}/public/empty-state/integration.svg (100%) rename {apps/app => web}/public/empty-state/invitation.svg (100%) rename {apps/app => web}/public/empty-state/issue-archive.svg (100%) rename {apps/app => web}/public/empty-state/issue.svg (100%) rename {apps/app => web}/public/empty-state/label.svg (100%) rename {apps/app => web}/public/empty-state/module.svg (100%) rename {apps/app => web}/public/empty-state/my-issues.svg (100%) rename {apps/app => web}/public/empty-state/notification.svg (100%) rename {apps/app => web}/public/empty-state/page.svg (100%) rename {apps/app => web}/public/empty-state/project.svg (100%) rename {apps/app => web}/public/empty-state/recent_activity.svg (100%) rename {apps/app => web}/public/empty-state/state_graph.svg (100%) rename {apps/app => web}/public/empty-state/view.svg (100%) rename {apps/space => web}/public/favicon/android-chrome-192x192.png (100%) rename {apps/space => web}/public/favicon/android-chrome-512x512.png (100%) rename {apps/space => web}/public/favicon/apple-touch-icon.png (100%) rename {apps/space => web}/public/favicon/favicon-16x16.png (100%) rename {apps/space => web}/public/favicon/favicon-32x32.png (100%) rename {apps/space => web}/public/favicon/favicon.ico (100%) rename {apps/space => web}/public/favicon/site.webmanifest (100%) rename {apps/app => web}/public/logos/github-black.png (100%) rename {apps/app => web}/public/logos/github-square.png (100%) rename {apps/app => web}/public/logos/github-white.png (100%) rename {apps/app => web}/public/mac-command.svg (100%) rename {apps/app => web}/public/onboarding/cycles.svg (100%) rename {apps/app => web}/public/onboarding/cycles.webp (100%) rename {apps/app => web}/public/onboarding/issues.svg (100%) rename {apps/app => web}/public/onboarding/issues.webp (100%) rename {apps/app => web}/public/onboarding/modules.svg (100%) rename {apps/app => web}/public/onboarding/modules.webp (100%) rename {apps/app => web}/public/onboarding/pages.svg (100%) rename {apps/app => web}/public/onboarding/pages.webp (100%) rename {apps/app => web}/public/onboarding/views.svg (100%) rename {apps/app => web}/public/onboarding/views.webp (100%) rename {apps/space => web}/public/plane-logos/black-horizontal-with-blue-logo.svg (100%) rename {apps/app => web}/public/plane-logos/blue-without-text.png (100%) rename {apps/space => web}/public/plane-logos/white-horizontal-with-blue-logo.svg (100%) rename {apps/space => web}/public/plane-logos/white-horizontal.svg (100%) rename {apps/app => web}/public/services/csv.svg (100%) rename {apps/app => web}/public/services/excel.svg (100%) rename {apps/app => web}/public/services/github.png (100%) rename {apps/app => web}/public/services/jira.png (100%) rename {apps/app => web}/public/services/json.svg (100%) rename {apps/app => web}/public/services/slack.png (100%) rename {apps/app => web}/public/site.webmanifest.json (100%) rename {apps/app => web}/public/sw.js (100%) rename {apps/app => web}/public/sw.js.map (100%) rename {apps/app => web}/public/user.png (100%) rename {apps/app => web}/public/workbox-7805bd61.js (100%) rename {apps/app => web}/public/workbox-7805bd61.js.map (100%) rename {apps/app => web}/sentry.client.config.js (100%) rename {apps/app => web}/sentry.edge.config.js (100%) rename {apps/app => web}/sentry.properties (100%) rename {apps/app => web}/sentry.server.config.js (100%) rename {apps/app => web}/services/ai.service.ts (100%) rename {apps/app => web}/services/analytics.service.ts (100%) rename {apps/app => web}/services/api.service.ts (100%) rename {apps/app => web}/services/app-installations.service.ts (77%) rename {apps/app => web}/services/authentication.service.ts (100%) rename {apps/app => web}/services/cycles.service.ts (100%) rename {apps/app => web}/services/estimates.service.ts (100%) rename {apps/app => web}/services/file.service.ts (100%) rename {apps/app => web}/services/inbox.service.ts (100%) rename {apps/app => web}/services/integration/csv.services.ts (100%) rename {apps/app => web}/services/integration/github.service.ts (100%) rename {apps/app => web}/services/integration/index.ts (100%) rename {apps/app => web}/services/integration/jira.service.ts (100%) rename {apps/app => web}/services/issues.service.ts (100%) rename {apps/app => web}/services/modules.service.ts (98%) rename {apps/app => web}/services/notifications.service.ts (100%) rename {apps/app => web}/services/pages.service.ts (100%) rename {apps/app => web}/services/project-publish.service.ts (100%) rename {apps/app => web}/services/project.service.ts (100%) rename {apps/app => web}/services/reaction.service.ts (100%) rename {apps/app => web}/services/state.service.ts (100%) rename {apps/app => web}/services/track-event.service.ts (100%) rename {apps/app => web}/services/user.service.ts (100%) rename {apps/app => web}/services/views.service.ts (100%) rename {apps/app => web}/services/web-waitlist.service.ts (100%) rename {apps/app => web}/services/workspace.service.ts (100%) rename {apps/app => web}/store/issues.ts (100%) rename {apps/app => web}/store/project-publish.tsx (100%) rename {apps/app => web}/store/root.ts (100%) rename {apps/app => web}/store/theme.ts (100%) rename {apps/app => web}/store/user.ts (100%) rename {apps/app => web}/styles/command-pallette.css (100%) rename {apps/space => web}/styles/editor.css (100%) rename {apps/app => web}/styles/globals.css (100%) rename {apps/app => web}/styles/nprogress.css (100%) rename {apps/app => web}/styles/react-datepicker.css (100%) rename {apps/app => web}/tailwind.config.js (100%) create mode 100644 web/tsconfig.json rename {apps/app => web}/types/ai.d.ts (100%) rename {apps/app => web}/types/analytics.d.ts (100%) rename {apps/app => web}/types/calendar.ts (100%) rename {apps/app => web}/types/cycles.d.ts (100%) rename {apps/app => web}/types/estimate.d.ts (100%) rename {apps/app => web}/types/importer/github-importer.d.ts (100%) rename {apps/app => web}/types/importer/index.ts (100%) rename {apps/app => web}/types/importer/jira-importer.d.ts (100%) rename {apps/app => web}/types/inbox.d.ts (100%) rename {apps/app => web}/types/index.d.ts (99%) rename {apps/app => web}/types/integration.d.ts (100%) rename {apps/app => web}/types/issues.d.ts (100%) rename {apps/app => web}/types/modules.d.ts (100%) rename {apps/app => web}/types/notifications.d.ts (100%) rename {apps/app => web}/types/pages.d.ts (100%) rename {apps/app => web}/types/projects.d.ts (99%) rename {apps/app => web}/types/reaction.d.ts (100%) rename {apps/app => web}/types/state.d.ts (100%) rename {apps/app => web}/types/users.d.ts (99%) rename {apps/app => web}/types/views.d.ts (100%) rename {apps/app => web}/types/waitlist.d.ts (100%) rename {apps/app => web}/types/workspace.d.ts (100%) diff --git a/.eslintrc.js b/.eslintrc.js index 463c86901..c229c0952 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,7 +4,7 @@ module.exports = { extends: ["custom"], settings: { next: { - rootDir: ["apps/*"], + rootDir: ["web/", "space/"], }, }, }; diff --git a/.github/workflows/Build_Test_Pull_Request.yml b/.github/workflows/Build_Test_Pull_Request.yml index 0dbca646a..438bdbef3 100644 --- a/.github/workflows/Build_Test_Pull_Request.yml +++ b/.github/workflows/Build_Test_Pull_Request.yml @@ -29,9 +29,9 @@ jobs: apiserver: - apiserver/** web: - - apps/app/** + - web/** deploy: - - apps/space/** + - space/** - name: Setup .npmrc for repository run: | @@ -40,15 +40,15 @@ jobs: - name: Build Plane's Main App if: steps.changed-files.outputs.web_any_changed == 'true' run: | - mv ./.npmrc ./apps/app - cd apps/app + mv ./.npmrc ./web + cd web yarn yarn build - name: Build Plane's Deploy App if: steps.changed-files.outputs.deploy_any_changed == 'true' run: | - cd apps/space + cd space yarn yarn build diff --git a/.github/workflows/Update_Docker_Images.yml b/.github/workflows/Update_Docker_Images.yml index 8e27e098f..57dbb4a67 100644 --- a/.github/workflows/Update_Docker_Images.yml +++ b/.github/workflows/Update_Docker_Images.yml @@ -62,7 +62,7 @@ jobs: uses: docker/build-push-action@v4.0.0 with: context: . - file: ./apps/app/Dockerfile.web + file: ./web/Dockerfile.web platforms: linux/amd64 tags: ${{ steps.metaFrontend.outputs.tags }} push: true @@ -88,7 +88,7 @@ jobs: uses: docker/build-push-action@v4.0.0 with: context: . - file: ./apps/space/Dockerfile.space + file: ./space/Dockerfile.space platforms: linux/amd64 push: true tags: ${{ steps.metaDeploy.outputs.tags }} diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..f2bf4259f --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,11 @@ +# This configuration file was automatically generated by Gitpod. +# Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml) +# and commit this file to your remote git repository to share the goodness with others. + +# Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart + +tasks: + - init: yarn install && yarn run build + command: yarn run start + + diff --git a/.husky/pre-push b/.husky/pre-push index 1feec0de6..0e7d3240b 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -3,21 +3,21 @@ changed_files=$(git diff --name-only HEAD~1) -app_changed=$(echo "$changed_files" | grep -E '^apps/app/' || true) -space_changed=$(echo "$changed_files" | grep -E '^apps/space/' || true) -echo $app_changed +web_changed=$(echo "$changed_files" | grep -E '^web/' || true) +space_changed=$(echo "$changed_files" | grep -E '^space/' || true) +echo $web_changed echo $space_changed -if [ -n "$app_changed" ] && [ -n "$space_changed" ]; then - echo "Changes detected in both apps/app and apps/space. Building..." +if [ -n "$web_changed" ] && [ -n "$space_changed" ]; then + echo "Changes detected in both web and space. Building..." yarn run lint yarn run build -elif [ -n "$app_changed" ]; then - echo "Changes detected in apps/app. Building..." - yarn run lint --filter=app - yarn run build --filter=app +elif [ -n "$web_changed" ]; then + echo "Changes detected in web app. Building..." + yarn run lint --filter=web + yarn run build --filter=web elif [ -n "$space_changed" ]; then - echo "Changes detected in apps/space. Building..." + echo "Changes detected in space app. Building..." yarn run lint --filter=space yarn run build --filter=space fi diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 294dc1c0e..cd74b6121 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within @@ -125,4 +125,4 @@ enforcement ladder](https://github.com/mozilla/diversity). For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. \ No newline at end of file +https://www.contributor-covenant.org/translations. diff --git a/README.md b/README.md index 2bc2764f3..a5a7ddd87 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,10 @@ Meet [Plane](https://plane.so). An open-source software development tool to manage issues, sprints, and product roadmaps with peace of mind 🧘‍♀️. - > Plane is still in its early days, not everything will be perfect yet, and hiccups may happen. Please let us know of any suggestions, ideas, or bugs that you encounter on our [Discord](https://discord.com/invite/A92xrEGCge) or GitHub issues, and we will use your feedback to improve on our upcoming releases. The easiest way to get started with Plane is by creating a [Plane Cloud](https://app.plane.so) account. Plane Cloud offers a hosted solution for Plane. If you prefer to self-host Plane, please refer to our [deployment documentation](https://docs.plane.so/self-hosting). - ## ⚡️ Quick start with Docker Compose ### Docker Compose Setup @@ -56,7 +54,7 @@ chmod +x setup.sh - Run setup.sh ```bash -./setup.sh http://localhost +./setup.sh http://localhost ``` > If running in a cloud env replace localhost with public facing IP address of the VM @@ -65,31 +63,32 @@ chmod +x setup.sh Visit [Tiptap Pro](https://collab.tiptap.dev/pro-extensions) and signup (it is free). - Create a **`.npmrc`** file, copy the following and replace your registry token generated from Tiptap Pro. + Create a **`.npmrc`** file, copy the following and replace your registry token generated from Tiptap Pro. ``` @tiptap-pro:registry=https://registry.tiptap.dev/ //registry.tiptap.dev/:_authToken=YOUR_REGISTRY_TOKEN ``` + - Run Docker compose up ```bash docker compose up -d ``` -You can use the default email and password for your first login `captain@plane.so` and `password123`. +You can use the default email and password for your first login `captain@plane.so` and `password123`. ## 🚀 Features -* **Issue Planning and Tracking**: Quickly create issues and add details using a powerful rich text editor that supports file uploads. Add sub-properties and references to issues for better organization and tracking. -* **Issue Attachments**: Collaborate effectively by attaching files to issues, making it easy for your team to find and share important project-related documents. -* **Layouts**: Customize your project view with your preferred layout - choose from List, Kanban, or Calendar to visualize your project in a way that makes sense to you. -* **Cycles**: Plan sprints with Cycles to keep your team on track and productive. Gain insights into your project's progress with burn-down charts and other useful features. -* **Modules**: Break down your large projects into smaller, more manageable modules. Assign modules between teams to easily track and plan your project's progress. -* **Views**: Create custom filters to display only the issues that matter to you. Save and share your filters in just a few clicks. -* **Pages**: Plane pages function as an AI-powered notepad, allowing you to easily document issues, cycle plans, and module details, and then synchronize them with your issues. -* **Command K**: Enjoy a better user experience with the new Command + K menu. Easily manage and navigate through your projects from one convenient location. -* **GitHub Sync**: Streamline your planning process by syncing your GitHub issues with Plane. Keep all your issues in one place for better tracking and collaboration. +- **Issue Planning and Tracking**: Quickly create issues and add details using a powerful rich text editor that supports file uploads. Add sub-properties and references to issues for better organization and tracking. +- **Issue Attachments**: Collaborate effectively by attaching files to issues, making it easy for your team to find and share important project-related documents. +- **Layouts**: Customize your project view with your preferred layout - choose from List, Kanban, or Calendar to visualize your project in a way that makes sense to you. +- **Cycles**: Plan sprints with Cycles to keep your team on track and productive. Gain insights into your project's progress with burn-down charts and other useful features. +- **Modules**: Break down your large projects into smaller, more manageable modules. Assign modules between teams to easily track and plan your project's progress. +- **Views**: Create custom filters to display only the issues that matter to you. Save and share your filters in just a few clicks. +- **Pages**: Plane pages function as an AI-powered notepad, allowing you to easily document issues, cycle plans, and module details, and then synchronize them with your issues. +- **Command K**: Enjoy a better user experience with the new Command + K menu. Easily manage and navigate through your projects from one convenient location. +- **GitHub Sync**: Streamline your planning process by syncing your GitHub issues with Plane. Keep all your issues in one place for better tracking and collaboration. ## 📸 Screenshots @@ -150,7 +149,6 @@ docker compose up -d

- ## 📚Documentation For full documentation, visit [docs.plane.so](https://docs.plane.so/) diff --git a/apps/app/components/icons/blocked-icon.tsx b/apps/app/components/icons/blocked-icon.tsx deleted file mode 100644 index ee0024fa0..000000000 --- a/apps/app/components/icons/blocked-icon.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const BlockedIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - - ); diff --git a/apps/app/components/icons/blocker-icon.tsx b/apps/app/components/icons/blocker-icon.tsx deleted file mode 100644 index 093728cd8..000000000 --- a/apps/app/components/icons/blocker-icon.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const BlockerIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - - ); diff --git a/apps/app/components/icons/bolt-icon.tsx b/apps/app/components/icons/bolt-icon.tsx deleted file mode 100644 index 569767aa5..000000000 --- a/apps/app/components/icons/bolt-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const BoltIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/cancel-icon.tsx b/apps/app/components/icons/cancel-icon.tsx deleted file mode 100644 index c3170ca32..000000000 --- a/apps/app/components/icons/cancel-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const CancelIcon: React.FC = ({ width, height, className }) => ( - - - - ); diff --git a/apps/app/components/icons/clipboard-icon.tsx b/apps/app/components/icons/clipboard-icon.tsx deleted file mode 100644 index c96aa3fde..000000000 --- a/apps/app/components/icons/clipboard-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const ClipboardIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/comment-icon.tsx b/apps/app/components/icons/comment-icon.tsx deleted file mode 100644 index c60cca4a6..000000000 --- a/apps/app/components/icons/comment-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const CommentIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/completed-cycle-icon.tsx b/apps/app/components/icons/completed-cycle-icon.tsx deleted file mode 100644 index 615fbcb9a..000000000 --- a/apps/app/components/icons/completed-cycle-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const CompletedCycleIcon: React.FC = ({ - width = "24", - height = "24", - className, - color = "black", -}) => ( - - - - ); diff --git a/apps/app/components/icons/current-cycle-icon.tsx b/apps/app/components/icons/current-cycle-icon.tsx deleted file mode 100644 index 2b07edf2e..000000000 --- a/apps/app/components/icons/current-cycle-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const CurrentCycleIcon: React.FC = ({ - width = "24", - height = "24", - className, - color = "black", -}) => ( - - - - ); diff --git a/apps/app/components/icons/edit-icon.tsx b/apps/app/components/icons/edit-icon.tsx deleted file mode 100644 index c4e012e4d..000000000 --- a/apps/app/components/icons/edit-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const EditIcon: React.FC = ({ width, height, className }) => ( - - - - ); diff --git a/apps/app/components/icons/ellipsis-horizontal-icon.tsx b/apps/app/components/icons/ellipsis-horizontal-icon.tsx deleted file mode 100644 index cfdd66751..000000000 --- a/apps/app/components/icons/ellipsis-horizontal-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const EllipsisHorizontalIcon: React.FC = ({ width, height, className }) => ( - - - - ); diff --git a/apps/app/components/icons/lock-icon.tsx b/apps/app/components/icons/lock-icon.tsx deleted file mode 100644 index d0c9cffb7..000000000 --- a/apps/app/components/icons/lock-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const LockIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/menu-icon.tsx b/apps/app/components/icons/menu-icon.tsx deleted file mode 100644 index 0a8816b75..000000000 --- a/apps/app/components/icons/menu-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const MenuIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/plus-icon.tsx b/apps/app/components/icons/plus-icon.tsx deleted file mode 100644 index 0b958a21d..000000000 --- a/apps/app/components/icons/plus-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const PlusIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/question-mark-circle-icon.tsx b/apps/app/components/icons/question-mark-circle-icon.tsx deleted file mode 100644 index 2cdf9d8e5..000000000 --- a/apps/app/components/icons/question-mark-circle-icon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const QuestionMarkCircleIcon: React.FC = ({ - width = "24", - height = "24", - className, -}) => ( - - - - ); diff --git a/apps/app/components/icons/signal-cellular-icon.tsx b/apps/app/components/icons/signal-cellular-icon.tsx deleted file mode 100644 index 0e785d958..000000000 --- a/apps/app/components/icons/signal-cellular-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const SignalCellularIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/tag-icon.tsx b/apps/app/components/icons/tag-icon.tsx deleted file mode 100644 index a17d4c1e4..000000000 --- a/apps/app/components/icons/tag-icon.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const TagIcon: React.FC = ({ - width = "24", - height = "24", - className, - color = "black", -}) => ( - - - - ); diff --git a/apps/app/components/icons/transfer-icon.tsx b/apps/app/components/icons/transfer-icon.tsx deleted file mode 100644 index 176c38b29..000000000 --- a/apps/app/components/icons/transfer-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const TransferIcon: React.FC = ({ width, height, className, color }) => ( - - - - ); diff --git a/apps/app/components/icons/tune-icon.tsx b/apps/app/components/icons/tune-icon.tsx deleted file mode 100644 index 1221b2976..000000000 --- a/apps/app/components/icons/tune-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const TuneIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/upcoming-cycle-icon.tsx b/apps/app/components/icons/upcoming-cycle-icon.tsx deleted file mode 100644 index 52961e15e..000000000 --- a/apps/app/components/icons/upcoming-cycle-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const UpcomingCycleIcon: React.FC = ({ - width = "24", - height = "24", - className, - color = "black", -}) => ( - - - - ); diff --git a/apps/app/components/icons/user-icon-circle.tsx b/apps/app/components/icons/user-icon-circle.tsx deleted file mode 100644 index 8bae34133..000000000 --- a/apps/app/components/icons/user-icon-circle.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const UserCircleIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/icons/user-icon.tsx b/apps/app/components/icons/user-icon.tsx deleted file mode 100644 index c0408dad3..000000000 --- a/apps/app/components/icons/user-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import type { Props } from "./types"; - -export const UserIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - ); diff --git a/apps/app/components/integration/slack/index.ts b/apps/app/components/integration/slack/index.ts deleted file mode 100644 index 3bd1c965c..000000000 --- a/apps/app/components/integration/slack/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./select-channel"; \ No newline at end of file diff --git a/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx deleted file mode 100644 index b3f99855e..000000000 --- a/apps/app/components/tiptap/table-menu/InsertBottomTableIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -const InsertBottomTableIcon = (props: any) => ( - - - -) - -export default InsertBottomTableIcon; diff --git a/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx deleted file mode 100644 index 8a92705d8..000000000 --- a/apps/app/components/tiptap/table-menu/InsertLeftTableIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -const InsertLeftTableIcon = (props: any) => ( - - - -) -export default InsertLeftTableIcon diff --git a/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx deleted file mode 100644 index 04348ece1..000000000 --- a/apps/app/components/tiptap/table-menu/InsertRightTableIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -const InsertRightTableIcon = (props: any) => ( - - - -) - -export default InsertRightTableIcon diff --git a/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx b/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx deleted file mode 100644 index 14036f998..000000000 --- a/apps/app/components/tiptap/table-menu/InsertTopTableIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -const InsertTopTableIcon = (props: any) => ( - - - -) -export default InsertTopTableIcon; diff --git a/apps/space/public/logos/github-black.png b/apps/space/public/logos/github-black.png deleted file mode 100644 index 7a7a82474ff108faf2c883c5616c83160c889c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14032 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 F|34@0LH+;$ diff --git a/apps/space/public/logos/github-square.png b/apps/space/public/logos/github-square.png deleted file mode 100644 index 527ba79f25878c988d6abb3af215b1f5f4d98ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmV-03D5S4P))l_nNYDAs-fRE%x7N4T`qti2WQ=H$X(9tf z{vi@WKNtQZk}L8rk>7QHG*YBMg#S+@he{@aB~pB#Xrv_BjFe;_DjRM|2_$8jPZf=X zz?D$cAH?L)&*xy>qEO_Q3RE&%VkiQrSg|5iuU=jKU!g(;_1X9D-|5SjFH}@iM8(C$ z>hCZ^t;o=31ceE;YSp41J$g{@-o2?ymoC(%O&h9Pw=UJJS(7SPu1rx;QS|leS9<^c zJ-vDJhVt_ADEoFcWnIal^z?Lk^ypEzh)TdeFr$#!Z2kK6dHVF}eDvs1{_x=gyM++K zw{G3ywQJXMpFVw9hzzBl$)QjjSj>Vub?U?$H*Vy|j~}zw`26`ZXJ%${VqzlKs8J(S z}MQ5ew^#os~0|Eh7TXk@7}%RzXITtt5m5H zdSV6)7{ISzzvjOZcI?>UCf?B>+@whpzJ2?)sRD>A;B!8G`o!UaCk?OPS}Sz*zl zMWG=EA^4#~hb&KifAZuBr>3Uzuwld0IVVq^Y&kwZ zKcD;d?dv@;Q>RX~y~yRumzVh+QiB5r4tO?;9z1x!vu4d=$;!*zxPpQL%imtTdQ}CY zI@cRj%8nJpgy{6?($1LsS+Vh;rr1k@zOswrv~95=svrKBTOyEE2OMxlnrb z>XpiLtp#*#Svo^XAPRU9i`Zl9IwYK9 zmE~A#EEWU18*WL=h!G=H9aaZeS){5)k%EL0Byp4W_TN2>pW%36z8i_w{G23Z9@n5?%ngE{^5y?8#hj+COSafhMcZS9XfQ- z_VT}N`Hdu3AwK}-l$)EYHCBpjB$>D2cc#Q(-$w@$zfju0)5tHte$=sJ$F#;`b;7=u z5iDnn4kVeQJ9qAopK$TwMXhnQYu7f7XH1E)^Vp?8uHzRoD#iW#_qE1h#Wjn)Oo zPdbpI75NR4WowU>(x>6)ro`x^0f26t<5wVSH-afKhz@n2OJF$RM5prQ%Nu@fdiA<~ zL&^x`H`K3JUwbTCPK;nm43<3|fEbCA$xn!DAE!Om>^e<}F{_dV0&xK10Y5>acI~k* zUc4~;+>{uUA9VodHE`fS@(ZAkE-@&jK7IPs@HU1v+HpL1@L;Ihzig#{|NdND zT&%4#YQ*HU>>zQB+K15vQvLb!=ZB)RNlPT};q2^eb^_V%aZU_m<;sBSztM1*q^Mwl+*eUky+h=!d^Dogp zk$F1P@W80rp^Ru&<%6Zh^wtxSA!)^n7cK!NwUbAM6vS<7TL^<_CD4U`IsB`DeJagtuWj2Kc?mM|~(==|F zwNf|$X2+j_?bsuSkErHmj6q*7is5#x80a{FL&uh{E-A8Cq?LrTZVMi%G4 z$~RTcCU!8DjEoEp7Vw1*{F|O)Fcq_Q5H##aQTfN%X3d)M&Ye5??%lhpi4oslyLL^* zMbXjGu87&Xbt?x0EEt;YAI^w@pc@H}&As2q~2nD^{>uAeci- zn!|HCQxF%5B{&eWcdg7Qn2Wa(ta@$$Q(w4np__9$R}%4rYLgE@US1w2PD*s!R~r&y zmM&fD_MGk%ZQs7V;j>7HaV}rJto+HCF=IGBKAsa25>%kLV8H_2rLv4THKn4WB3`|E zbucFE{w|^;)5xsM03y-47HVRU-+9n|5!8=WjDg4cbRcEKAJMW?!QIyZ9?cm&dUUX) z1WybE<^fx_dlCg5lWvJww{D%~v5_vEIdewkZeBgFl;Z_C5Ga+No^Glrhy039DTlSj*ACR1A*Xi)22uoN0M-=ei}DGS0-BWv88(U>{*hel0t-BkzY#xz>6OEZz-8AflQ_PRMBwCuVjK> zeWqwQC6#P2jY9ms2cHSruhctZ{){Lag7Bu07%F*z*UyApDtUnyTG@Z6l6S`Z5B>`< W&#HdDYlN8q0000Vy*j diff --git a/apps/space/public/logos/github-white.png b/apps/space/public/logos/github-white.png deleted file mode 100644 index dbb2b578cb6bc41059e08eea448a9a88d78d6b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16559 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 diff --git a/apps/space/tsconfig.json b/apps/space/tsconfig.json deleted file mode 100644 index 5404bd9fb..000000000 --- a/apps/space/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "baseUrl": ".", - "paths": {}, - "plugins": [{ "name": "next" }] - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "server.js", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/docker-compose.yml b/docker-compose.yml index f69f5be1d..4fe7f4ab7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,176 +1,194 @@ version: "3.8" -x-api-and-worker-env: - &api-and-worker-env - DEBUG: ${DEBUG} - SENTRY_DSN: ${SENTRY_DSN} - DJANGO_SETTINGS_MODULE: plane.settings.production - DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@${PGHOST}:5432/${PGDATABASE} - REDIS_URL: redis://plane-redis:6379/ - EMAIL_HOST: ${EMAIL_HOST} - EMAIL_HOST_USER: ${EMAIL_HOST_USER} - EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} - EMAIL_PORT: ${EMAIL_PORT} - EMAIL_FROM: ${EMAIL_FROM} - EMAIL_USE_TLS: ${EMAIL_USE_TLS} - EMAIL_USE_SSL: ${EMAIL_USE_SSL} - AWS_REGION: ${AWS_REGION} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} - AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} - FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT} - WEB_URL: ${WEB_URL} - GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} - DISABLE_COLLECTSTATIC: 1 - DOCKERIZED: 1 - OPENAI_API_BASE: ${OPENAI_API_BASE} - OPENAI_API_KEY: ${OPENAI_API_KEY} - GPT_ENGINE: ${GPT_ENGINE} - SECRET_KEY: ${SECRET_KEY} - DEFAULT_EMAIL: ${DEFAULT_EMAIL} - DEFAULT_PASSWORD: ${DEFAULT_PASSWORD} - USE_MINIO: ${USE_MINIO} - ENABLE_SIGNUP: ${ENABLE_SIGNUP} +x-api-and-worker-env: &api-and-worker-env + DEBUG: ${DEBUG} + SENTRY_DSN: ${SENTRY_DSN} + DJANGO_SETTINGS_MODULE: plane.settings.production + DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@${PGHOST}:5432/${PGDATABASE} + REDIS_URL: redis://plane-redis:6379/ + EMAIL_HOST: ${EMAIL_HOST} + EMAIL_HOST_USER: ${EMAIL_HOST_USER} + EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} + EMAIL_PORT: ${EMAIL_PORT} + EMAIL_FROM: ${EMAIL_FROM} + EMAIL_USE_TLS: ${EMAIL_USE_TLS} + EMAIL_USE_SSL: ${EMAIL_USE_SSL} + AWS_REGION: ${AWS_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} + AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} + FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT} + WEB_URL: ${WEB_URL} + GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} + DISABLE_COLLECTSTATIC: 1 + DOCKERIZED: 1 + OPENAI_API_BASE: ${OPENAI_API_BASE} + OPENAI_API_KEY: ${OPENAI_API_KEY} + GPT_ENGINE: ${GPT_ENGINE} + SECRET_KEY: ${SECRET_KEY} + DEFAULT_EMAIL: ${DEFAULT_EMAIL} + DEFAULT_PASSWORD: ${DEFAULT_PASSWORD} + USE_MINIO: ${USE_MINIO} + ENABLE_SIGNUP: ${ENABLE_SIGNUP} services: - plane-web: - container_name: planefrontend - build: - context: . - dockerfile: ./apps/app/Dockerfile.web - args: - NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 - NEXT_PUBLIC_DEPLOY_URL: http://localhost/spaces - restart: always - command: /usr/local/bin/start.sh apps/app/server.js app - env_file: - - .env - environment: - NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} - NEXT_PUBLIC_DEPLOY_URL: ${NEXT_PUBLIC_DEPLOY_URL} - NEXT_PUBLIC_GOOGLE_CLIENTID: "0" - NEXT_PUBLIC_GITHUB_APP_NAME: "0" - NEXT_PUBLIC_GITHUB_ID: "0" - NEXT_PUBLIC_SENTRY_DSN: "0" - NEXT_PUBLIC_ENABLE_OAUTH: "0" - NEXT_PUBLIC_ENABLE_SENTRY: "0" - NEXT_PUBLIC_ENABLE_SESSION_RECORDER: "0" - NEXT_PUBLIC_TRACK_EVENTS: "0" - depends_on: - - plane-api - - plane-worker + plane-web: + container_name: planefrontend + build: + context: . + dockerfile: ./web/Dockerfile.web + args: + NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 + NEXT_PUBLIC_DEPLOY_URL: http://localhost/spaces + restart: always + command: /usr/local/bin/start.sh web/server.js web + env_file: + - .env + environment: + NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} + NEXT_PUBLIC_DEPLOY_URL: ${NEXT_PUBLIC_DEPLOY_URL} + NEXT_PUBLIC_GOOGLE_CLIENTID: "0" + NEXT_PUBLIC_GITHUB_APP_NAME: "0" + NEXT_PUBLIC_GITHUB_ID: "0" + NEXT_PUBLIC_SENTRY_DSN: "0" + NEXT_PUBLIC_ENABLE_OAUTH: "0" + NEXT_PUBLIC_ENABLE_SENTRY: "0" + NEXT_PUBLIC_ENABLE_SESSION_RECORDER: "0" + NEXT_PUBLIC_TRACK_EVENTS: "0" + depends_on: + - plane-api + - plane-worker - plane-api: - container_name: planebackend - build: - context: ./apiserver - dockerfile: Dockerfile.api - restart: always - command: ./bin/takeoff - env_file: - - .env - environment: - <<: *api-and-worker-env - depends_on: - - plane-db - - plane-redis + plane-deploy: + container_name: planedeploy + build: + context: . + dockerfile: ./space/Dockerfile.space + args: + DOCKER_BUILDKIT: 1 + NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 + restart: always + command: /usr/local/bin/start.sh space/server.js space + env_file: + - .env + environment: + - NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL} + depends_on: + - plane-api + - plane-worker + - plane-web - plane-worker: - container_name: planebgworker - build: - context: ./apiserver - dockerfile: Dockerfile.api - restart: always - command: ./bin/worker - env_file: - - .env - environment: - <<: *api-and-worker-env - depends_on: - - plane-api - - plane-db - - plane-redis + plane-api: + container_name: planebackend + build: + context: ./apiserver + dockerfile: Dockerfile.api + restart: always + command: ./bin/takeoff + env_file: + - .env + environment: + <<: *api-and-worker-env + depends_on: + - plane-db + - plane-redis - plane-beat-worker: - container_name: planebeatworker - build: - context: ./apiserver - dockerfile: Dockerfile.api - restart: always - command: ./bin/beat - env_file: - - .env - environment: - <<: *api-and-worker-env - depends_on: - - plane-api - - plane-db - - plane-redis + plane-worker: + container_name: planebgworker + build: + context: ./apiserver + dockerfile: Dockerfile.api + restart: always + command: ./bin/worker + env_file: + - .env + environment: + <<: *api-and-worker-env + depends_on: + - plane-api + - plane-db + - plane-redis - plane-db: - container_name: plane-db - image: postgres:15.2-alpine - restart: always - command: postgres -c 'max_connections=1000' - volumes: - - pgdata:/var/lib/postgresql/data - env_file: - - .env - environment: - POSTGRES_USER: ${PGUSER} - POSTGRES_DB: ${PGDATABASE} - POSTGRES_PASSWORD: ${PGPASSWORD} - PGDATA: /var/lib/postgresql/data + plane-beat-worker: + container_name: planebeatworker + build: + context: ./apiserver + dockerfile: Dockerfile.api + restart: always + command: ./bin/beat + env_file: + - .env + environment: + <<: *api-and-worker-env + depends_on: + - plane-api + - plane-db + - plane-redis - plane-redis: - container_name: plane-redis - image: redis:6.2.7-alpine - restart: always - volumes: - - redisdata:/data + plane-db: + container_name: plane-db + image: postgres:15.2-alpine + restart: always + command: postgres -c 'max_connections=1000' + volumes: + - pgdata:/var/lib/postgresql/data + env_file: + - .env + environment: + POSTGRES_USER: ${PGUSER} + POSTGRES_DB: ${PGDATABASE} + POSTGRES_PASSWORD: ${PGPASSWORD} + PGDATA: /var/lib/postgresql/data - plane-minio: - container_name: plane-minio - image: minio/minio - restart: always - command: server /export --console-address ":9090" - volumes: - - uploads:/export - env_file: - - .env - environment: - MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} - MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + plane-redis: + container_name: plane-redis + image: redis:6.2.7-alpine + restart: always + volumes: + - redisdata:/data - createbuckets: - image: minio/mc - entrypoint: > - /bin/sh -c " /usr/bin/mc config host add plane-minio http://plane-minio:9000 \$AWS_ACCESS_KEY_ID \$AWS_SECRET_ACCESS_KEY; /usr/bin/mc mb plane-minio/\$AWS_S3_BUCKET_NAME; /usr/bin/mc anonymous set download plane-minio/\$AWS_S3_BUCKET_NAME; exit 0; " - env_file: - - .env - depends_on: - - plane-minio + plane-minio: + container_name: plane-minio + image: minio/minio + restart: always + command: server /export --console-address ":9090" + volumes: + - uploads:/export + env_file: + - .env + environment: + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} - # Comment this if you already have a reverse proxy running - plane-proxy: - container_name: planeproxy - build: - context: ./nginx - dockerfile: Dockerfile - restart: always - ports: - - ${NGINX_PORT}:80 - env_file: - - .env - environment: - FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} - BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} - depends_on: - - plane-web - - plane-api + createbuckets: + image: minio/mc + entrypoint: > + /bin/sh -c " /usr/bin/mc config host add plane-minio http://plane-minio:9000 \$AWS_ACCESS_KEY_ID \$AWS_SECRET_ACCESS_KEY; /usr/bin/mc mb plane-minio/\$AWS_S3_BUCKET_NAME; /usr/bin/mc anonymous set download plane-minio/\$AWS_S3_BUCKET_NAME; exit 0; " + env_file: + - .env + depends_on: + - plane-minio + + # Comment this if you already have a reverse proxy running + plane-proxy: + container_name: planeproxy + build: + context: ./nginx + dockerfile: Dockerfile + restart: always + ports: + - ${NGINX_PORT}:80 + env_file: + - .env + environment: + FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} + BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} + depends_on: + - plane-web + - plane-api volumes: - pgdata: - redisdata: - uploads: + pgdata: + redisdata: + uploads: diff --git a/nginx/nginx.conf.template b/nginx/nginx.conf.template index 206c94b51..974f4907d 100644 --- a/nginx/nginx.conf.template +++ b/nginx/nginx.conf.template @@ -19,6 +19,10 @@ server { proxy_pass http://planebackend:8000/api/; } + location /spaces/ { + proxy_pass http://planedeploy:3000/spaces/; + } + location /${BUCKET_NAME}/ { proxy_pass http://plane-minio:9000/uploads/; } diff --git a/package.json b/package.json index b99978f20..397952b3b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "license": "AGPL-3.0", "private": true, "workspaces": [ - "apps/*", + "web", + "space", "packages/*" ], "scripts": { @@ -12,9 +13,9 @@ "dev": "turbo run dev", "start": "turbo run start", "lint": "turbo run lint", - "clean": "turbo run clean" + "clean": "turbo run clean", + "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, - "devDependencies": { "eslint-config-custom": "*", "prettier": "latest", diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js index 4d8295125..d31a76406 100644 --- a/packages/eslint-config-custom/index.js +++ b/packages/eslint-config-custom/index.js @@ -4,7 +4,7 @@ module.exports = { plugins: ["react", "@typescript-eslint"], settings: { next: { - rootDir: ["app/", "docs/", "packages/*/"], + rootDir: ["web/", "space/", "packages/*/"], }, }, rules: { diff --git a/apps/space/.env.example b/space/.env.example similarity index 100% rename from apps/space/.env.example rename to space/.env.example diff --git a/apps/app/.eslintrc.js b/space/.eslintrc.js similarity index 100% rename from apps/app/.eslintrc.js rename to space/.eslintrc.js diff --git a/apps/space/.gitignore b/space/.gitignore similarity index 100% rename from apps/space/.gitignore rename to space/.gitignore diff --git a/apps/space/.prettierignore b/space/.prettierignore similarity index 100% rename from apps/space/.prettierignore rename to space/.prettierignore diff --git a/apps/space/.prettierrc.json b/space/.prettierrc.json similarity index 100% rename from apps/space/.prettierrc.json rename to space/.prettierrc.json diff --git a/apps/space/Dockerfile.space b/space/Dockerfile.space similarity index 81% rename from apps/space/Dockerfile.space rename to space/Dockerfile.space index 0240ddbf7..34fe42a13 100644 --- a/apps/space/Dockerfile.space +++ b/space/Dockerfile.space @@ -44,14 +44,15 @@ RUN addgroup --system --gid 1001 plane RUN adduser --system --uid 1001 captain USER captain -COPY --from=installer /app/apps/space/next.config.js . -COPY --from=installer /app/apps/space/package.json . +COPY --from=installer /app/space/next.config.js . +COPY --from=installer /app/space/package.json . -# Automatically leverage output traces to reduce image size +# Automatically leverage output traces to reduce image sizß # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=installer --chown=captain:plane /app/apps/space/.next/standalone ./ +COPY --from=installer --chown=captain:plane /app/space/.next/standalone ./ -COPY --from=installer --chown=captain:plane /app/apps/space/.next ./apps/space/.next +COPY --from=installer --chown=captain:plane /app/space/.next ./space/.next +COPY --from=installer --chown=captain:plane /app/space/public ./space/public ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000 ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \ diff --git a/apps/space/README.md b/space/README.md similarity index 100% rename from apps/space/README.md rename to space/README.md diff --git a/apps/space/components/accounts/email-code-form.tsx b/space/components/accounts/email-code-form.tsx similarity index 100% rename from apps/space/components/accounts/email-code-form.tsx rename to space/components/accounts/email-code-form.tsx diff --git a/apps/space/components/accounts/email-password-form.tsx b/space/components/accounts/email-password-form.tsx similarity index 100% rename from apps/space/components/accounts/email-password-form.tsx rename to space/components/accounts/email-password-form.tsx diff --git a/apps/space/components/accounts/email-reset-password-form.tsx b/space/components/accounts/email-reset-password-form.tsx similarity index 100% rename from apps/space/components/accounts/email-reset-password-form.tsx rename to space/components/accounts/email-reset-password-form.tsx diff --git a/apps/space/components/accounts/github-login-button.tsx b/space/components/accounts/github-login-button.tsx similarity index 93% rename from apps/space/components/accounts/github-login-button.tsx rename to space/components/accounts/github-login-button.tsx index 4ba47b421..e9b30ab73 100644 --- a/apps/space/components/accounts/github-login-button.tsx +++ b/space/components/accounts/github-login-button.tsx @@ -5,8 +5,8 @@ import { useRouter } from "next/router"; // next-themes import { useTheme } from "next-themes"; // images -import githubBlackImage from "/public/logos/github-black.png"; -import githubWhiteImage from "/public/logos/github-white.png"; +import githubBlackImage from "public/logos/github-black.svg"; +import githubWhiteImage from "public/logos/github-white.svg"; export interface GithubLoginButtonProps { handleSignIn: React.Dispatch; diff --git a/apps/space/components/accounts/google-login.tsx b/space/components/accounts/google-login.tsx similarity index 100% rename from apps/space/components/accounts/google-login.tsx rename to space/components/accounts/google-login.tsx diff --git a/apps/space/components/accounts/index.ts b/space/components/accounts/index.ts similarity index 100% rename from apps/space/components/accounts/index.ts rename to space/components/accounts/index.ts diff --git a/apps/space/components/accounts/onboarding-form.tsx b/space/components/accounts/onboarding-form.tsx similarity index 100% rename from apps/space/components/accounts/onboarding-form.tsx rename to space/components/accounts/onboarding-form.tsx diff --git a/apps/space/components/icons/index.ts b/space/components/icons/index.ts similarity index 100% rename from apps/space/components/icons/index.ts rename to space/components/icons/index.ts diff --git a/apps/space/components/icons/issue-group/backlog-state-icon.tsx b/space/components/icons/issue-group/backlog-state-icon.tsx similarity index 100% rename from apps/space/components/icons/issue-group/backlog-state-icon.tsx rename to space/components/icons/issue-group/backlog-state-icon.tsx diff --git a/apps/space/components/icons/issue-group/cancelled-state-icon.tsx b/space/components/icons/issue-group/cancelled-state-icon.tsx similarity index 100% rename from apps/space/components/icons/issue-group/cancelled-state-icon.tsx rename to space/components/icons/issue-group/cancelled-state-icon.tsx diff --git a/apps/space/components/icons/issue-group/completed-state-icon.tsx b/space/components/icons/issue-group/completed-state-icon.tsx similarity index 100% rename from apps/space/components/icons/issue-group/completed-state-icon.tsx rename to space/components/icons/issue-group/completed-state-icon.tsx diff --git a/apps/space/components/icons/issue-group/started-state-icon.tsx b/space/components/icons/issue-group/started-state-icon.tsx similarity index 100% rename from apps/space/components/icons/issue-group/started-state-icon.tsx rename to space/components/icons/issue-group/started-state-icon.tsx diff --git a/apps/space/components/icons/issue-group/unstarted-state-icon.tsx b/space/components/icons/issue-group/unstarted-state-icon.tsx similarity index 100% rename from apps/space/components/icons/issue-group/unstarted-state-icon.tsx rename to space/components/icons/issue-group/unstarted-state-icon.tsx diff --git a/apps/space/components/icons/types.d.ts b/space/components/icons/types.d.ts similarity index 100% rename from apps/space/components/icons/types.d.ts rename to space/components/icons/types.d.ts diff --git a/apps/space/components/issues/board-views/block-downvotes.tsx b/space/components/issues/board-views/block-downvotes.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-downvotes.tsx rename to space/components/issues/board-views/block-downvotes.tsx diff --git a/apps/space/components/issues/board-views/block-due-date.tsx b/space/components/issues/board-views/block-due-date.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-due-date.tsx rename to space/components/issues/board-views/block-due-date.tsx diff --git a/apps/space/components/issues/board-views/block-labels.tsx b/space/components/issues/board-views/block-labels.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-labels.tsx rename to space/components/issues/board-views/block-labels.tsx diff --git a/apps/space/components/issues/board-views/block-priority.tsx b/space/components/issues/board-views/block-priority.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-priority.tsx rename to space/components/issues/board-views/block-priority.tsx diff --git a/apps/space/components/issues/board-views/block-state.tsx b/space/components/issues/board-views/block-state.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-state.tsx rename to space/components/issues/board-views/block-state.tsx diff --git a/apps/space/components/issues/board-views/block-upvotes.tsx b/space/components/issues/board-views/block-upvotes.tsx similarity index 100% rename from apps/space/components/issues/board-views/block-upvotes.tsx rename to space/components/issues/board-views/block-upvotes.tsx diff --git a/apps/space/components/issues/board-views/calendar/index.tsx b/space/components/issues/board-views/calendar/index.tsx similarity index 100% rename from apps/space/components/issues/board-views/calendar/index.tsx rename to space/components/issues/board-views/calendar/index.tsx diff --git a/apps/space/components/issues/board-views/gantt/index.tsx b/space/components/issues/board-views/gantt/index.tsx similarity index 100% rename from apps/space/components/issues/board-views/gantt/index.tsx rename to space/components/issues/board-views/gantt/index.tsx diff --git a/apps/space/components/issues/board-views/kanban/block.tsx b/space/components/issues/board-views/kanban/block.tsx similarity index 98% rename from apps/space/components/issues/board-views/kanban/block.tsx rename to space/components/issues/board-views/kanban/block.tsx index 07375fe36..40f6576be 100644 --- a/apps/space/components/issues/board-views/kanban/block.tsx +++ b/space/components/issues/board-views/kanban/block.tsx @@ -24,6 +24,7 @@ export const IssueListBlock = observer(({ issue }: { issue: IIssue }) => { const handleBlockClick = () => { issueDetailStore.setPeekId(issue.id); router.replace( + `/[workspace_slug]/[project_slug]`, { pathname: `/${workspace_slug?.toString()}/${project_slug}`, query: { @@ -31,7 +32,6 @@ export const IssueListBlock = observer(({ issue }: { issue: IIssue }) => { peekId: issue.id, }, }, - undefined, { shallow: true } ); // router.push(`/${workspace_slug?.toString()}/${project_slug}?board=${board?.toString()}&peekId=${issue.id}`); diff --git a/apps/space/components/issues/board-views/kanban/header.tsx b/space/components/issues/board-views/kanban/header.tsx similarity index 100% rename from apps/space/components/issues/board-views/kanban/header.tsx rename to space/components/issues/board-views/kanban/header.tsx diff --git a/apps/space/components/issues/board-views/kanban/index.tsx b/space/components/issues/board-views/kanban/index.tsx similarity index 100% rename from apps/space/components/issues/board-views/kanban/index.tsx rename to space/components/issues/board-views/kanban/index.tsx diff --git a/apps/space/components/issues/board-views/list/block.tsx b/space/components/issues/board-views/list/block.tsx similarity index 98% rename from apps/space/components/issues/board-views/list/block.tsx rename to space/components/issues/board-views/list/block.tsx index 7e6175ebb..067d4693a 100644 --- a/apps/space/components/issues/board-views/list/block.tsx +++ b/space/components/issues/board-views/list/block.tsx @@ -27,6 +27,7 @@ export const IssueListBlock: FC<{ issue: IIssue }> = observer((props) => { const handleBlockClick = () => { issueDetailStore.setPeekId(issue.id); router.replace( + `/[workspace_slug]/[project_slug]`, { pathname: `/${workspace_slug?.toString()}/${project_slug}`, query: { @@ -34,7 +35,6 @@ export const IssueListBlock: FC<{ issue: IIssue }> = observer((props) => { peekId: issue.id, }, }, - undefined, { shallow: true } ); // router.push(`/${workspace_slug?.toString()}/${project_slug}?board=${board?.toString()}&peekId=${issue.id}`); diff --git a/apps/space/components/issues/board-views/list/header.tsx b/space/components/issues/board-views/list/header.tsx similarity index 100% rename from apps/space/components/issues/board-views/list/header.tsx rename to space/components/issues/board-views/list/header.tsx diff --git a/apps/space/components/issues/board-views/list/index.tsx b/space/components/issues/board-views/list/index.tsx similarity index 100% rename from apps/space/components/issues/board-views/list/index.tsx rename to space/components/issues/board-views/list/index.tsx diff --git a/apps/space/components/issues/board-views/spreadsheet/index.tsx b/space/components/issues/board-views/spreadsheet/index.tsx similarity index 100% rename from apps/space/components/issues/board-views/spreadsheet/index.tsx rename to space/components/issues/board-views/spreadsheet/index.tsx diff --git a/apps/space/components/issues/filters-render/index.tsx b/space/components/issues/filters-render/index.tsx similarity index 100% rename from apps/space/components/issues/filters-render/index.tsx rename to space/components/issues/filters-render/index.tsx diff --git a/apps/space/components/issues/filters-render/label/filter-label-block.tsx b/space/components/issues/filters-render/label/filter-label-block.tsx similarity index 100% rename from apps/space/components/issues/filters-render/label/filter-label-block.tsx rename to space/components/issues/filters-render/label/filter-label-block.tsx diff --git a/apps/space/components/issues/filters-render/label/index.tsx b/space/components/issues/filters-render/label/index.tsx similarity index 100% rename from apps/space/components/issues/filters-render/label/index.tsx rename to space/components/issues/filters-render/label/index.tsx diff --git a/apps/space/components/issues/filters-render/priority/filter-priority-block.tsx b/space/components/issues/filters-render/priority/filter-priority-block.tsx similarity index 100% rename from apps/space/components/issues/filters-render/priority/filter-priority-block.tsx rename to space/components/issues/filters-render/priority/filter-priority-block.tsx diff --git a/apps/space/components/issues/filters-render/priority/index.tsx b/space/components/issues/filters-render/priority/index.tsx similarity index 100% rename from apps/space/components/issues/filters-render/priority/index.tsx rename to space/components/issues/filters-render/priority/index.tsx diff --git a/apps/space/components/issues/filters-render/state/filter-state-block.tsx b/space/components/issues/filters-render/state/filter-state-block.tsx similarity index 100% rename from apps/space/components/issues/filters-render/state/filter-state-block.tsx rename to space/components/issues/filters-render/state/filter-state-block.tsx diff --git a/apps/space/components/issues/filters-render/state/index.tsx b/space/components/issues/filters-render/state/index.tsx similarity index 100% rename from apps/space/components/issues/filters-render/state/index.tsx rename to space/components/issues/filters-render/state/index.tsx diff --git a/apps/space/components/issues/navbar/index.tsx b/space/components/issues/navbar/index.tsx similarity index 100% rename from apps/space/components/issues/navbar/index.tsx rename to space/components/issues/navbar/index.tsx diff --git a/apps/space/components/issues/navbar/issue-board-view.tsx b/space/components/issues/navbar/issue-board-view.tsx similarity index 100% rename from apps/space/components/issues/navbar/issue-board-view.tsx rename to space/components/issues/navbar/issue-board-view.tsx diff --git a/apps/space/components/issues/navbar/issue-filter.tsx b/space/components/issues/navbar/issue-filter.tsx similarity index 100% rename from apps/space/components/issues/navbar/issue-filter.tsx rename to space/components/issues/navbar/issue-filter.tsx diff --git a/apps/space/components/issues/navbar/issue-view.tsx b/space/components/issues/navbar/issue-view.tsx similarity index 100% rename from apps/space/components/issues/navbar/issue-view.tsx rename to space/components/issues/navbar/issue-view.tsx diff --git a/apps/space/components/issues/navbar/search.tsx b/space/components/issues/navbar/search.tsx similarity index 100% rename from apps/space/components/issues/navbar/search.tsx rename to space/components/issues/navbar/search.tsx diff --git a/apps/space/components/issues/navbar/theme.tsx b/space/components/issues/navbar/theme.tsx similarity index 100% rename from apps/space/components/issues/navbar/theme.tsx rename to space/components/issues/navbar/theme.tsx diff --git a/apps/space/components/issues/peek-overview/add-comment.tsx b/space/components/issues/peek-overview/add-comment.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/add-comment.tsx rename to space/components/issues/peek-overview/add-comment.tsx diff --git a/apps/space/components/issues/peek-overview/comment-detail-card.tsx b/space/components/issues/peek-overview/comment-detail-card.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/comment-detail-card.tsx rename to space/components/issues/peek-overview/comment-detail-card.tsx diff --git a/apps/space/components/issues/peek-overview/full-screen-peek-view.tsx b/space/components/issues/peek-overview/full-screen-peek-view.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/full-screen-peek-view.tsx rename to space/components/issues/peek-overview/full-screen-peek-view.tsx diff --git a/apps/space/components/issues/peek-overview/header.tsx b/space/components/issues/peek-overview/header.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/header.tsx rename to space/components/issues/peek-overview/header.tsx diff --git a/apps/space/components/issues/peek-overview/index.ts b/space/components/issues/peek-overview/index.ts similarity index 100% rename from apps/space/components/issues/peek-overview/index.ts rename to space/components/issues/peek-overview/index.ts diff --git a/apps/space/components/issues/peek-overview/issue-activity.tsx b/space/components/issues/peek-overview/issue-activity.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-activity.tsx rename to space/components/issues/peek-overview/issue-activity.tsx diff --git a/apps/space/components/issues/peek-overview/issue-details.tsx b/space/components/issues/peek-overview/issue-details.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-details.tsx rename to space/components/issues/peek-overview/issue-details.tsx diff --git a/apps/space/components/issues/peek-overview/issue-emoji-reactions.tsx b/space/components/issues/peek-overview/issue-emoji-reactions.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-emoji-reactions.tsx rename to space/components/issues/peek-overview/issue-emoji-reactions.tsx diff --git a/apps/space/components/issues/peek-overview/issue-properties.tsx b/space/components/issues/peek-overview/issue-properties.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-properties.tsx rename to space/components/issues/peek-overview/issue-properties.tsx diff --git a/apps/space/components/issues/peek-overview/issue-reaction.tsx b/space/components/issues/peek-overview/issue-reaction.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-reaction.tsx rename to space/components/issues/peek-overview/issue-reaction.tsx diff --git a/apps/space/components/issues/peek-overview/issue-vote-reactions.tsx b/space/components/issues/peek-overview/issue-vote-reactions.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/issue-vote-reactions.tsx rename to space/components/issues/peek-overview/issue-vote-reactions.tsx diff --git a/apps/space/components/issues/peek-overview/layout.tsx b/space/components/issues/peek-overview/layout.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/layout.tsx rename to space/components/issues/peek-overview/layout.tsx diff --git a/apps/space/components/issues/peek-overview/side-peek-view.tsx b/space/components/issues/peek-overview/side-peek-view.tsx similarity index 100% rename from apps/space/components/issues/peek-overview/side-peek-view.tsx rename to space/components/issues/peek-overview/side-peek-view.tsx diff --git a/apps/space/components/tiptap/bubble-menu/index.tsx b/space/components/tiptap/bubble-menu/index.tsx similarity index 100% rename from apps/space/components/tiptap/bubble-menu/index.tsx rename to space/components/tiptap/bubble-menu/index.tsx diff --git a/apps/app/components/tiptap/bubble-menu/link-selector.tsx b/space/components/tiptap/bubble-menu/link-selector.tsx similarity index 92% rename from apps/app/components/tiptap/bubble-menu/link-selector.tsx rename to space/components/tiptap/bubble-menu/link-selector.tsx index 16072f4be..559521db6 100644 --- a/apps/app/components/tiptap/bubble-menu/link-selector.tsx +++ b/space/components/tiptap/bubble-menu/link-selector.tsx @@ -6,10 +6,9 @@ import isValidHttpUrl from "./utils/link-validator"; interface LinkSelectorProps { editor: Editor; isOpen: boolean; - setIsOpen: Dispatch> + setIsOpen: Dispatch>; } - export const LinkSelector: FC = ({ editor, isOpen, setIsOpen }) => { const inputRef = useRef(null); @@ -76,7 +75,9 @@ export const LinkSelector: FC = ({ editor, isOpen, setIsOpen ) : ( - ) : ( -