From 42cceb5e65513143c928e80c8304e12d387e8eef Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 26 Apr 2024 12:57:36 +0530 Subject: [PATCH 01/13] fix: filter state option order (#4284) --- .../issues/issue-layouts/filters/header/filters/state.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/issues/issue-layouts/filters/header/filters/state.tsx b/web/components/issues/issue-layouts/filters/header/filters/state.tsx index 56340e6db4..88068d6667 100644 --- a/web/components/issues/issue-layouts/filters/header/filters/state.tsx +++ b/web/components/issues/issue-layouts/filters/header/filters/state.tsx @@ -26,7 +26,7 @@ export const FilterState: React.FC = observer((props) => { const sortedOptions = useMemo(() => { const filteredOptions = (states ?? []).filter((s) => s.name.toLowerCase().includes(searchQuery.toLowerCase())); - return sortBy(filteredOptions, [(s) => !(appliedFilters ?? []).includes(s.id), (s) => s.name.toLowerCase()]); + return sortBy(filteredOptions, [(s) => !(appliedFilters ?? []).includes(s.id)]); // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchQuery]); From 88165a8fdbc4ecc5ac74f18ad787d8127e4f2c63 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 26 Apr 2024 12:58:27 +0530 Subject: [PATCH 02/13] chore: module and cycle sidebar stats item filter implementation (#4286) --- .../core/sidebar/sidebar-progress-stats.tsx | 102 ++++++++++-------- web/components/cycles/sidebar.tsx | 62 +++++++---- web/components/modules/sidebar.tsx | 39 ++++++- 3 files changed, 135 insertions(+), 68 deletions(-) diff --git a/web/components/core/sidebar/sidebar-progress-stats.tsx b/web/components/core/sidebar/sidebar-progress-stats.tsx index 528b8aa18d..db9d94a8fd 100644 --- a/web/components/core/sidebar/sidebar-progress-stats.tsx +++ b/web/components/core/sidebar/sidebar-progress-stats.tsx @@ -4,6 +4,8 @@ import Image from "next/image"; // headless ui import { Tab } from "@headlessui/react"; import { + IIssueFilterOptions, + IIssueFilters, IModule, TAssigneesDistribution, TCompletionChartDistribution, @@ -37,6 +39,9 @@ type Props = { roundedTab?: boolean; noBackground?: boolean; isPeekView?: boolean; + isCompleted?: boolean; + filters?: IIssueFilters | undefined; + handleFiltersUpdate: (key: keyof IIssueFilterOptions, value: string | string[]) => void; }; export const SidebarProgressStats: React.FC = ({ @@ -47,6 +52,9 @@ export const SidebarProgressStats: React.FC = ({ roundedTab, noBackground, isPeekView = false, + isCompleted = false, + filters, + handleFiltersUpdate, }) => { const { storedValue: tab, setValue: setTab } = useLocalStorage("tab", "Assignees"); @@ -145,20 +153,11 @@ export const SidebarProgressStats: React.FC = ({ } completed={assignee.completed_issues} total={assignee.total_issues} - {...(!isPeekView && { - onClick: () => { - // TODO: set filters here - // if (filters?.assignees?.includes(assignee.assignee_id ?? "")) - // setFilters({ - // assignees: filters?.assignees?.filter((a) => a !== assignee.assignee_id), - // }); - // else - // setFilters({ - // assignees: [...(filters?.assignees ?? []), assignee.assignee_id ?? ""], - // }); - }, - // selected: filters?.assignees?.includes(assignee.assignee_id ?? ""), - })} + {...(!isPeekView && + !isCompleted && { + onClick: () => handleFiltersUpdate("assignees", assignee.assignee_id ?? ""), + selected: filters?.filters?.assignees?.includes(assignee.assignee_id ?? ""), + })} /> ); else @@ -192,35 +191,52 @@ export const SidebarProgressStats: React.FC = ({ className="flex w-full flex-col gap-1.5 overflow-y-auto pt-3.5 vertical-scrollbar scrollbar-sm" > {distribution && distribution?.labels.length > 0 ? ( - distribution.labels.map((label, index) => ( - - - {label.label_name ?? "No labels"} - - } - completed={label.completed_issues} - total={label.total_issues} - {...(!isPeekView && { - // TODO: set filters here - onClick: () => { - // if (filters.labels?.includes(label.label_id ?? "")) - // setFilters({ - // labels: filters?.labels?.filter((l) => l !== label.label_id), - // }); - // else setFilters({ labels: [...(filters?.labels ?? []), label.label_id ?? ""] }); - }, - // selected: filters?.labels?.includes(label.label_id ?? ""), - })} - /> - )) + distribution.labels.map((label, index) => { + if (label.label_id) { + return ( + + + {label.label_name ?? "No labels"} + + } + completed={label.completed_issues} + total={label.total_issues} + {...(!isPeekView && + !isCompleted && { + onClick: () => handleFiltersUpdate("labels", label.label_id ?? ""), + selected: filters?.filters?.labels?.includes(label.label_id ?? `no-label-${index}`), + })} + /> + ); + } else { + return ( + + + {label.label_name ?? "No labels"} + + } + completed={label.completed_issues} + total={label.total_issues} + /> + ); + } + }) ) : (
diff --git a/web/components/cycles/sidebar.tsx b/web/components/cycles/sidebar.tsx index 106f3b3e01..9ada6cf639 100644 --- a/web/components/cycles/sidebar.tsx +++ b/web/components/cycles/sidebar.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import isEmpty from "lodash/isEmpty"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; @@ -16,7 +16,7 @@ import { } from "lucide-react"; import { Disclosure, Transition } from "@headlessui/react"; // types -import { ICycle } from "@plane/types"; +import { ICycle, IIssueFilterOptions } from "@plane/types"; // ui import { Avatar, ArchiveIcon, CustomMenu, Loader, LayersIcon, TOAST_TYPE, setToast, TextArea } from "@plane/ui"; // components @@ -27,12 +27,13 @@ import { DateRangeDropdown } from "@/components/dropdowns"; // constants import { CYCLE_STATUS } from "@/constants/cycle"; import { CYCLE_UPDATED } from "@/constants/event-tracker"; +import { EIssueFilterType, EIssuesStoreType } from "@/constants/issue"; import { EUserWorkspaceRoles } from "@/constants/workspace"; // helpers import { findHowManyDaysLeft, getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; // hooks -import { useEventTracker, useCycle, useUser, useMember } from "@/hooks/store"; +import { useEventTracker, useCycle, useUser, useMember, useIssues } from "@/hooks/store"; // services import { CycleService } from "@/services/cycle.service"; @@ -191,25 +192,36 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { } }; - // TODO: refactor this - // const handleFiltersUpdate = useCallback( - // (key: keyof IIssueFilterOptions, value: string | string[]) => { - // if (!workspaceSlug || !projectId) return; - // const newValues = issueFilters?.filters?.[key] ?? []; + const { + issuesFilter: { issueFilters, updateFilters }, + } = useIssues(EIssuesStoreType.CYCLE); - // if (Array.isArray(value)) { - // value.forEach((val) => { - // if (!newValues.includes(val)) newValues.push(val); - // }); - // } else { - // if (issueFilters?.filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); - // else newValues.push(value); - // } + const handleFiltersUpdate = useCallback( + (key: keyof IIssueFilterOptions, value: string | string[]) => { + if (!workspaceSlug || !projectId) return; + const newValues = issueFilters?.filters?.[key] ?? []; - // updateFilters(workspaceSlug.toString(), projectId.toString(), EFilterType.FILTERS, { [key]: newValues }, cycleId); - // }, - // [workspaceSlug, projectId, cycleId, issueFilters, updateFilters] - // ); + if (Array.isArray(value)) { + // this validation is majorly for the filter start_date, target_date custom + value.forEach((val) => { + if (!newValues.includes(val)) newValues.push(val); + else newValues.splice(newValues.indexOf(val), 1); + }); + } else { + if (issueFilters?.filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); + else newValues.push(value); + } + + updateFilters( + workspaceSlug.toString(), + projectId.toString(), + EIssueFilterType.FILTERS, + { [key]: newValues }, + cycleId + ); + }, + [workspaceSlug, projectId, cycleId, issueFilters, updateFilters] + ); const cycleStatus = cycleDetails?.status?.toLocaleLowerCase(); const isCompleted = cycleStatus === "completed"; @@ -251,8 +263,8 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { ? "0 Issue" : `${cycleDetails.progress_snapshot.completed_issues}/${cycleDetails.progress_snapshot.total_issues}` : cycleDetails.total_issues === 0 - ? "0 Issue" - : `${cycleDetails.completed_issues}/${cycleDetails.total_issues}`; + ? "0 Issue" + : `${cycleDetails.completed_issues}/${cycleDetails.total_issues}`; const daysLeft = findHowManyDaysLeft(cycleDetails.end_date); @@ -551,6 +563,9 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { }} totalIssues={cycleDetails.progress_snapshot.total_issues} isPeekView={Boolean(peekCycle)} + isCompleted={isCompleted} + filters={issueFilters} + handleFiltersUpdate={handleFiltersUpdate} />
)} @@ -570,6 +585,9 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { }} totalIssues={cycleDetails.total_issues} isPeekView={Boolean(peekCycle)} + isCompleted={isCompleted} + filters={issueFilters} + handleFiltersUpdate={handleFiltersUpdate} />
)} diff --git a/web/components/modules/sidebar.tsx b/web/components/modules/sidebar.tsx index f219aeb956..91d69c2e12 100644 --- a/web/components/modules/sidebar.tsx +++ b/web/components/modules/sidebar.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; import { Controller, useForm } from "react-hook-form"; @@ -15,7 +15,7 @@ import { UserCircle2, } from "lucide-react"; import { Disclosure, Transition } from "@headlessui/react"; -import { ILinkDetails, IModule, ModuleLink } from "@plane/types"; +import { IIssueFilterOptions, ILinkDetails, IModule, ModuleLink } from "@plane/types"; // ui import { CustomMenu, @@ -41,13 +41,14 @@ import { MODULE_LINK_UPDATED, MODULE_UPDATED, } from "@/constants/event-tracker"; +import { EIssueFilterType, EIssuesStoreType } from "@/constants/issue"; import { MODULE_STATUS } from "@/constants/module"; import { EUserProjectRoles } from "@/constants/project"; // helpers import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; // hooks -import { useModule, useUser, useEventTracker } from "@/hooks/store"; +import { useModule, useUser, useEventTracker, useIssues } from "@/hooks/store"; // types const defaultValues: Partial = { @@ -82,6 +83,9 @@ export const ModuleDetailsSidebar: React.FC = observer((props) => { const { getModuleById, updateModuleDetails, createModuleLink, updateModuleLink, deleteModuleLink, restoreModule } = useModule(); const { setTrackElement, captureModuleEvent, captureEvent } = useEventTracker(); + const { + issuesFilter: { issueFilters, updateFilters }, + } = useIssues(EIssuesStoreType.MODULE); const moduleDetails = getModuleById(moduleId); const moduleState = moduleDetails?.status?.toLocaleLowerCase(); @@ -245,6 +249,33 @@ export const ModuleDetailsSidebar: React.FC = observer((props) => { }); }, [moduleDetails, reset]); + const handleFiltersUpdate = useCallback( + (key: keyof IIssueFilterOptions, value: string | string[]) => { + if (!workspaceSlug || !projectId) return; + const newValues = issueFilters?.filters?.[key] ?? []; + + if (Array.isArray(value)) { + // this validation is majorly for the filter start_date, target_date custom + value.forEach((val) => { + if (!newValues.includes(val)) newValues.push(val); + else newValues.splice(newValues.indexOf(val), 1); + }); + } else { + if (issueFilters?.filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); + else newValues.push(value); + } + + updateFilters( + workspaceSlug.toString(), + projectId.toString(), + EIssueFilterType.FILTERS, + { [key]: newValues }, + moduleId + ); + }, + [workspaceSlug, projectId, moduleId, issueFilters, updateFilters] + ); + const startDate = getDate(moduleDetails?.start_date); const endDate = getDate(moduleDetails?.target_date); const isStartValid = startDate && startDate <= new Date(); @@ -599,6 +630,8 @@ export const ModuleDetailsSidebar: React.FC = observer((props) => { totalIssues={moduleDetails.total_issues} module={moduleDetails} isPeekView={Boolean(peekModule)} + filters={issueFilters} + handleFiltersUpdate={handleFiltersUpdate} /> )} From 80461e6484de47b6c80f347cb7d539f736ff7722 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:21:08 +0530 Subject: [PATCH 03/13] chore: filter member option sorting improvement (#4285) --- web/components/modules/dropdowns/filters/lead.tsx | 13 ++++++++----- .../modules/dropdowns/filters/members.tsx | 10 ++++++---- web/components/pages/list/filters/created-by.tsx | 9 ++++++--- web/components/project/dropdowns/filters/lead.tsx | 10 ++++++---- .../project/dropdowns/filters/members.tsx | 10 ++++++---- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/web/components/modules/dropdowns/filters/lead.tsx b/web/components/modules/dropdowns/filters/lead.tsx index b8dc8a9d46..9fa1ea5d5d 100644 --- a/web/components/modules/dropdowns/filters/lead.tsx +++ b/web/components/modules/dropdowns/filters/lead.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite"; // hooks import { Avatar, Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; // components // ui @@ -22,19 +22,22 @@ export const FilterLead: React.FC = observer((props: Props) => { const [previewEnabled, setPreviewEnabled] = useState(true); // store hooks const { getUserDetails } = useMember(); + const { currentUser } = useUser(); const appliedFiltersCount = appliedFilters?.length ?? 0; const sortedOptions = useMemo(() => { - const filteredOptions = (memberIds || []).filter( - (memberId) => getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) + const filteredOptions = (memberIds || []).filter((memberId) => + getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) ); return sortBy(filteredOptions, [ (memberId) => !(appliedFilters ?? []).includes(memberId), + (memberId) => memberId !== currentUser?.id, (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), ]); - }, [appliedFilters, getUserDetails, memberIds, , searchQuery]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchQuery]); const handleViewToggle = () => { if (!sortedOptions) return; @@ -65,7 +68,7 @@ export const FilterLead: React.FC = observer((props: Props) => { isChecked={appliedFilters?.includes(member.id) ? true : false} onClick={() => handleUpdate(member.id)} icon={} - title={member.display_name} + title={currentUser?.id === member.id ? "You" : member?.display_name} /> ); })} diff --git a/web/components/modules/dropdowns/filters/members.tsx b/web/components/modules/dropdowns/filters/members.tsx index 3db1f5d046..1a23d0c3e7 100644 --- a/web/components/modules/dropdowns/filters/members.tsx +++ b/web/components/modules/dropdowns/filters/members.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite"; // hooks import { Avatar, Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; // components // ui @@ -22,16 +22,18 @@ export const FilterMembers: React.FC = observer((props: Props) => { const [previewEnabled, setPreviewEnabled] = useState(true); // store hooks const { getUserDetails } = useMember(); + const { currentUser } = useUser(); const appliedFiltersCount = appliedFilters?.length ?? 0; const sortedOptions = useMemo(() => { - const filteredOptions = (memberIds || []).filter( - (memberId) => getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) + const filteredOptions = (memberIds || []).filter((memberId) => + getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) ); return sortBy(filteredOptions, [ (memberId) => !(appliedFilters ?? []).includes(memberId), + (memberId) => memberId !== currentUser?.id, (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), ]); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -66,7 +68,7 @@ export const FilterMembers: React.FC = observer((props: Props) => { isChecked={appliedFilters?.includes(member.id) ? true : false} onClick={() => handleUpdate(member.id)} icon={} - title={member.display_name} + title={currentUser?.id === member.id ? "You" : member?.display_name} /> ); })} diff --git a/web/components/pages/list/filters/created-by.tsx b/web/components/pages/list/filters/created-by.tsx index bddacc5504..a90d8bd145 100644 --- a/web/components/pages/list/filters/created-by.tsx +++ b/web/components/pages/list/filters/created-by.tsx @@ -6,7 +6,7 @@ import { Avatar, Loader } from "@plane/ui"; // components import { FilterHeader, FilterOption } from "@/components/issues"; // hooks -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; type Props = { appliedFilters: string[] | null; @@ -22,6 +22,7 @@ export const FilterCreatedBy: React.FC = observer((props: Props) => { const [previewEnabled, setPreviewEnabled] = useState(true); // store hooks const { getUserDetails } = useMember(); + const { currentUser } = useUser(); const appliedFiltersCount = appliedFilters?.length ?? 0; @@ -32,9 +33,11 @@ export const FilterCreatedBy: React.FC = observer((props: Props) => { return sortBy(filteredOptions, [ (memberId) => !(appliedFilters ?? []).includes(memberId), + (memberId) => memberId !== currentUser?.id, (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), ]); - }, [appliedFilters, getUserDetails, memberIds, searchQuery]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchQuery]); const handleViewToggle = () => { if (!sortedOptions) return; @@ -65,7 +68,7 @@ export const FilterCreatedBy: React.FC = observer((props: Props) => { isChecked={appliedFilters?.includes(member.id) ? true : false} onClick={() => handleUpdate(member.id)} icon={} - title={member.display_name} + title={currentUser?.id === member.id ? "You" : member?.display_name} /> ); })} diff --git a/web/components/project/dropdowns/filters/lead.tsx b/web/components/project/dropdowns/filters/lead.tsx index 2bfea97dfe..9fa1ea5d5d 100644 --- a/web/components/project/dropdowns/filters/lead.tsx +++ b/web/components/project/dropdowns/filters/lead.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite"; // hooks import { Avatar, Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; // components // ui @@ -22,16 +22,18 @@ export const FilterLead: React.FC = observer((props: Props) => { const [previewEnabled, setPreviewEnabled] = useState(true); // store hooks const { getUserDetails } = useMember(); + const { currentUser } = useUser(); const appliedFiltersCount = appliedFilters?.length ?? 0; const sortedOptions = useMemo(() => { - const filteredOptions = (memberIds || []).filter( - (memberId) => getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) + const filteredOptions = (memberIds || []).filter((memberId) => + getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) ); return sortBy(filteredOptions, [ (memberId) => !(appliedFilters ?? []).includes(memberId), + (memberId) => memberId !== currentUser?.id, (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), ]); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -66,7 +68,7 @@ export const FilterLead: React.FC = observer((props: Props) => { isChecked={appliedFilters?.includes(member.id) ? true : false} onClick={() => handleUpdate(member.id)} icon={} - title={member.display_name} + title={currentUser?.id === member.id ? "You" : member?.display_name} /> ); })} diff --git a/web/components/project/dropdowns/filters/members.tsx b/web/components/project/dropdowns/filters/members.tsx index 3db1f5d046..1a23d0c3e7 100644 --- a/web/components/project/dropdowns/filters/members.tsx +++ b/web/components/project/dropdowns/filters/members.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite"; // hooks import { Avatar, Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; // components // ui @@ -22,16 +22,18 @@ export const FilterMembers: React.FC = observer((props: Props) => { const [previewEnabled, setPreviewEnabled] = useState(true); // store hooks const { getUserDetails } = useMember(); + const { currentUser } = useUser(); const appliedFiltersCount = appliedFilters?.length ?? 0; const sortedOptions = useMemo(() => { - const filteredOptions = (memberIds || []).filter( - (memberId) => getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) + const filteredOptions = (memberIds || []).filter((memberId) => + getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) ); return sortBy(filteredOptions, [ (memberId) => !(appliedFilters ?? []).includes(memberId), + (memberId) => memberId !== currentUser?.id, (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), ]); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -66,7 +68,7 @@ export const FilterMembers: React.FC = observer((props: Props) => { isChecked={appliedFilters?.includes(member.id) ? true : false} onClick={() => handleUpdate(member.id)} icon={} - title={member.display_name} + title={currentUser?.id === member.id ? "You" : member?.display_name} /> ); })} From f2fa6452c9278baaf8ff5c599d196d561dd37e19 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:56:51 +0530 Subject: [PATCH 04/13] fix: cycle and module quick action z-index (#4293) --- web/components/cycles/board/cycles-board-card.tsx | 2 +- web/components/cycles/list/cycles-list-item.tsx | 2 +- web/components/modules/module-card-item.tsx | 2 +- web/components/modules/module-list-item.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/components/cycles/board/cycles-board-card.tsx b/web/components/cycles/board/cycles-board-card.tsx index a7ea629469..ea659569c5 100644 --- a/web/components/cycles/board/cycles-board-card.tsx +++ b/web/components/cycles/board/cycles-board-card.tsx @@ -235,7 +235,7 @@ export const CyclesBoardCard: FC = observer((props) => { -
+
{isEditingAllowed && ( { diff --git a/web/components/cycles/list/cycles-list-item.tsx b/web/components/cycles/list/cycles-list-item.tsx index a7194ecbd4..a6262dfe7f 100644 --- a/web/components/cycles/list/cycles-list-item.tsx +++ b/web/components/cycles/list/cycles-list-item.tsx @@ -202,7 +202,7 @@ export const CyclesListItem: FC = observer((props) => {
-
+
{currentCycle && (
= observer((props) => {
-
+
{isEditingAllowed && ( { diff --git a/web/components/modules/module-list-item.tsx b/web/components/modules/module-list-item.tsx index 152ad8ca37..6b2c8c2bae 100644 --- a/web/components/modules/module-list-item.tsx +++ b/web/components/modules/module-list-item.tsx @@ -175,7 +175,7 @@ export const ModuleListItem: React.FC = observer((props) => {
-
+
{moduleStatus && ( Date: Fri, 26 Apr 2024 17:41:25 +0530 Subject: [PATCH 05/13] fix: adding caddy config --- deploy/cli-install/Caddyfile | 18 +++ deploy/cli-install/docker-compose-caddy.yml | 161 ++++++++++++++++++++ deploy/cli-install/docker-compose.yml | 156 +++++++++++++++++++ deploy/cli-install/variables.env | 56 +++++++ 4 files changed, 391 insertions(+) create mode 100644 deploy/cli-install/Caddyfile create mode 100644 deploy/cli-install/docker-compose-caddy.yml create mode 100644 deploy/cli-install/docker-compose.yml create mode 100644 deploy/cli-install/variables.env diff --git a/deploy/cli-install/Caddyfile b/deploy/cli-install/Caddyfile new file mode 100644 index 0000000000..2ab9d05032 --- /dev/null +++ b/deploy/cli-install/Caddyfile @@ -0,0 +1,18 @@ +{ + email {$CERT_EMAIL} + {$CERT_ACME_DNS} +} + +{$APP_PROTOCOL}://{$DOMAIN_NAME} { + request_body { + max_size {$FILE_SIZE_LIMIT} + } + + reverse_proxy /spaces/* space:3000 + + reverse_proxy /api/* api:8000 + + reverse_proxy /{$BUCKET_NAME}/* plane-minio:9000 + + reverse_proxy /* web:3000 +} diff --git a/deploy/cli-install/docker-compose-caddy.yml b/deploy/cli-install/docker-compose-caddy.yml new file mode 100644 index 0000000000..01c370a8e2 --- /dev/null +++ b/deploy/cli-install/docker-compose-caddy.yml @@ -0,0 +1,161 @@ +x-proxy-env : &proxy-env + environment: + - DOMAIN_NAME=${DOMAIN_NAME:-localhost} + - CERT_EMAIL=${CERT_EMAIL:-admin@localhost} + - APP_PROTOCOL=${APP_PROTOCOL:-http} + - CERT_ACME_DNS=${CERT_ACME_DNS:-} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + - LISTEN_HTTP_PORT=${LISTEN_HTTP_PORT:-80} + - LISTEN_HTTPS_PORT=${LISTEN_HTTPS_PORT:-443} + +x-app-env : &app-env + environment: + - NGINX_PORT=${NGINX_PORT:-80} + - WEB_URL=${WEB_URL:-http://localhost} + - DEBUG=${DEBUG:-0} + - SENTRY_DSN=${SENTRY_DSN:-""} + - SENTRY_ENVIRONMENT=${SENTRY_ENVIRONMENT:-"production"} + - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-} + # Gunicorn Workers + - GUNICORN_WORKERS=${GUNICORN_WORKERS:-2} + #DB SETTINGS + - PGHOST=${PGHOST:-plane-db} + - PGDATABASE=${PGDATABASE:-plane} + - POSTGRES_USER=${POSTGRES_USER:-plane} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-plane} + - POSTGRES_DB=${POSTGRES_DB:-plane} + - PGDATA=${PGDATA:-/var/lib/postgresql/data} + - DATABASE_URL=${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} + # REDIS SETTINGS + - REDIS_HOST=${REDIS_HOST:-plane-redis} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_URL=${REDIS_URL:-redis://plane-redis:6379/} + # Application secret + - SECRET_KEY=${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} + # DATA STORE SETTINGS + - USE_MINIO=${USE_MINIO:-1} + - AWS_REGION=${AWS_REGION:-""} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"access-key"} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"secret-key"} + - AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} + - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME:-uploads} + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-"access-key"} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-"secret-key"} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + +services: + web: + <<: *app-env + image: registry.plane.tools/plane-one/plane-frontend-one:${APP_RELEASE_VERSION} + restart: unless-stopped + command: /usr/local/bin/start.sh web/server.js web + deploy: + replicas: ${WEB_REPLICAS:-1} + depends_on: + - api + - worker + + space: + <<: *app-env + image: registry.plane.tools/plane-one/plane-space-one:${APP_RELEASE_VERSION} + restart: unless-stopped + command: /usr/local/bin/start.sh space/server.js space + deploy: + replicas: ${SPACE_REPLICAS:-1} + depends_on: + - api + - worker + - web + + api: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/takeoff + deploy: + replicas: ${API_REPLICAS:-1} + # volumes: + # - ${INSTALL_DIR}/logs/api:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + worker: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/worker + # volumes: + # - ${INSTALL_DIR}/logs/worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + beat-worker: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/beat + # volumes: + # - ${INSTALL_DIR}/logs/beat-worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + migrator: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + restart: no + command: > + sh -c "python manage.py wait_for_db && + python manage.py migrate" + # volumes: + # - ${INSTALL_DIR}/logs/migrator:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + plane-db: + <<: *app-env + image: postgres:15.5-alpine + restart: unless-stopped + command: postgres -c 'max_connections=1000' + volumes: + - ${INSTALL_DIR}/data/db:/var/lib/postgresql/data + + plane-redis: + <<: *app-env + image: redis:7.2.4-alpine + restart: unless-stopped + volumes: + - ${INSTALL_DIR}/data/redis:/data + + plane-minio: + <<: *app-env + image: minio/minio:latest + restart: unless-stopped + command: server /export --console-address ":9090" + volumes: + - ${INSTALL_DIR}/data/minio/uploads:/export + - ${INSTALL_DIR}/data/minio/data:/data + + # Comment this if you already have a reverse proxy running + proxy: + <<: *proxy-env + image: makeplane/caddy:latest + restart: unless-stopped + ports: + - ${LISTEN_HTTP_PORT:-80}:80 + - ${LISTEN_HTTPS_PORT:-443}:443 + volumes: + - ${INSTALL_DIR}/Caddyfile:/etc/caddy/Caddyfile + - ${INSTALL_DIR}/caddy/config:/config + - ${INSTALL_DIR}/caddy/data:/data + depends_on: + - web + - api + - space diff --git a/deploy/cli-install/docker-compose.yml b/deploy/cli-install/docker-compose.yml new file mode 100644 index 0000000000..602eda169e --- /dev/null +++ b/deploy/cli-install/docker-compose.yml @@ -0,0 +1,156 @@ +# version: "3.8" + +x-app-env : &app-env + environment: + - NGINX_PORT=${NGINX_PORT:-80} + - WEB_URL=${WEB_URL:-http://localhost} + - DEBUG=${DEBUG:-0} + - SENTRY_DSN=${SENTRY_DSN:-""} + - SENTRY_ENVIRONMENT=${SENTRY_ENVIRONMENT:-"production"} + - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-} + # Gunicorn Workers + - GUNICORN_WORKERS=${GUNICORN_WORKERS:-2} + #DB SETTINGS + - PGHOST=${PGHOST:-plane-db} + - PGDATABASE=${PGDATABASE:-plane} + - POSTGRES_USER=${POSTGRES_USER:-plane} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-plane} + - POSTGRES_DB=${POSTGRES_DB:-plane} + - PGDATA=${PGDATA:-/var/lib/postgresql/data} + - DATABASE_URL=${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} + # REDIS SETTINGS + - REDIS_HOST=${REDIS_HOST:-plane-redis} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_URL=${REDIS_URL:-redis://plane-redis:6379/} + # Application secret + - SECRET_KEY=${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} + # DATA STORE SETTINGS + - USE_MINIO=${USE_MINIO:-1} + - AWS_REGION=${AWS_REGION:-""} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"access-key"} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"secret-key"} + - AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} + - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME:-uploads} + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-"access-key"} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-"secret-key"} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + +services: + web: + <<: *app-env + image: registry.plane.tools/plane-one/plane-frontend-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: /usr/local/bin/start.sh web/server.js web + deploy: + replicas: ${WEB_REPLICAS:-1} + depends_on: + - api + - worker + + space: + <<: *app-env + image: registry.plane.tools/plane-one/plane-space-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: /usr/local/bin/start.sh space/server.js space + deploy: + replicas: ${SPACE_REPLICAS:-1} + depends_on: + - api + - worker + - web + + api: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/takeoff + deploy: + replicas: ${API_REPLICAS:-1} + # volumes: + # - ${INSTALL_DIR}/logs/api:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + worker: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/worker + # volumes: + # - ${INSTALL_DIR}/logs/worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + beat-worker: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/beat + # volumes: + # - ${INSTALL_DIR}/logs/beat-worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + migrator: + <<: *app-env + image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: no + command: > + sh -c "python manage.py wait_for_db && + python manage.py migrate" + # volumes: + # - ${INSTALL_DIR}/logs/migrator:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + plane-db: + <<: *app-env + image: postgres:15.5-alpine + pull_policy: if_not_present + restart: unless-stopped + command: postgres -c 'max_connections=1000' + volumes: + - ${INSTALL_DIR}/data/db:/var/lib/postgresql/data + plane-redis: + <<: *app-env + image: redis:7.2.4-alpine + pull_policy: if_not_present + restart: unless-stopped + volumes: + - ${INSTALL_DIR}/data/redis:/data + + plane-minio: + <<: *app-env + image: minio/minio:latest + pull_policy: if_not_present + restart: unless-stopped + command: server /export --console-address ":9090" + volumes: + - ${INSTALL_DIR}/data/minio/uploads:/export + - ${INSTALL_DIR}/data/minio/data:/data + + # Comment this if you already have a reverse proxy running + proxy: + <<: *app-env + image: registry.plane.tools/plane-one/plane-proxy-one:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + ports: + - ${NGINX_PORT}:80 + depends_on: + - web + - api + - space diff --git a/deploy/cli-install/variables.env b/deploy/cli-install/variables.env new file mode 100644 index 0000000000..8490ea273d --- /dev/null +++ b/deploy/cli-install/variables.env @@ -0,0 +1,56 @@ +INSTALL_DIR=/opt/plane + +WEB_REPLICAS=1 +SPACE_REPLICAS=1 +API_REPLICAS=1 + +NGINX_PORT=80 +LISTEN_HTTP_PORT=80 +LISTEN_HTTPS_PORT=443 + +APP_PROTOCOL=http + +# If SSL Cert to be generated, set CERT_EMAIL and APP_PROTOCOL to https +CERT_EMAIL=admin@localhost + +# For DNS Challenge based certificate generation, set the CERT_ACME_DNS +# CERT_ACME_DNS=acme_dns CERT_DNS_PROVIDER CERT_DNS_PROVIDER_API_KEY +CERT_ACME_DNS= + +WEB_URL=http://localhost +DEBUG=0 +SENTRY_DSN= +SENTRY_ENVIRONMENT=production +CORS_ALLOWED_ORIGINS=http://localhost + +#DB SETTINGS +PGHOST=plane-db +PGDATABASE=plane +POSTGRES_USER=plane +POSTGRES_PASSWORD=plane +POSTGRES_DB=plane +PGDATA=/var/lib/postgresql/data +DATABASE_URL= + +# REDIS SETTINGS +REDIS_HOST=plane-redis +REDIS_PORT=6379 +REDIS_URL= + +# Secret Key +SECRET_KEY=60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5 + +# DATA STORE SETTINGS +USE_MINIO=1 +AWS_REGION= +AWS_ACCESS_KEY_ID=access-key +AWS_SECRET_ACCESS_KEY=secret-key +AWS_S3_ENDPOINT_URL=http://plane-minio:9000 +AWS_S3_BUCKET_NAME=uploads +MINIO_ROOT_USER=access-key +MINIO_ROOT_PASSWORD=secret-key +BUCKET_NAME=uploads +FILE_SIZE_LIMIT=5242880 + +# Gunicorn Workers +GUNICORN_WORKERS=2 From 3afe07542f7b0a5c0a44033669f30f5febe122aa Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 26 Apr 2024 18:00:10 +0530 Subject: [PATCH 06/13] fix: update branch build --- .github/workflows/build-branch-ee.yml | 152 +++++++++++++++++--------- 1 file changed, 101 insertions(+), 51 deletions(-) diff --git a/.github/workflows/build-branch-ee.yml b/.github/workflows/build-branch-ee.yml index df55fa7431..a512ffa876 100644 --- a/.github/workflows/build-branch-ee.yml +++ b/.github/workflows/build-branch-ee.yml @@ -18,17 +18,17 @@ jobs: name: Build-Push Web/Space/API/Proxy Docker Image runs-on: ubuntu-latest outputs: - gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }} + gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }} gh_buildx_driver: ${{ steps.set_env_variables.outputs.BUILDX_DRIVER }} gh_buildx_version: ${{ steps.set_env_variables.outputs.BUILDX_VERSION }} gh_buildx_platforms: ${{ steps.set_env_variables.outputs.BUILDX_PLATFORMS }} gh_buildx_endpoint: ${{ steps.set_env_variables.outputs.BUILDX_ENDPOINT }} - build_frontend: ${{ steps.changed_files.outputs.frontend_any_changed }} + build_web: ${{ steps.changed_files.outputs.web_any_changed }} build_space: ${{ steps.changed_files.outputs.space_any_changed }} build_backend: ${{ steps.changed_files.outputs.backend_any_changed }} build_proxy: ${{ steps.changed_files.outputs.proxy_any_changed }} - docker_upload_to_s3: ${{ steps.set_env_variables.outputs.docker_upload_to_s3 }} - docker_tar_suffix: ${{ steps.set_env_variables.outputs.docker_tar_suffix }} + artifact_upload_to_s3: ${{ steps.set_env_variables.outputs.artifact_upload_to_s3 }} + artifact_s3_suffix: ${{ steps.set_env_variables.outputs.artifact_s3_suffix }} steps: - id: set_env_variables @@ -45,17 +45,21 @@ jobs: echo "BUILDX_PLATFORMS=linux/amd64" >> $GITHUB_OUTPUT echo "BUILDX_ENDPOINT=" >> $GITHUB_OUTPUT fi - echo "TARGET_BRANCH=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT + BR_NAME=$( echo "${{ env.TARGET_BRANCH }}" | tr / -) + echo "TARGET_BRANCH=$BR_NAME" >> $GITHUB_OUTPUT if [ "${{ github.event_name }}" == "release" ]; then - echo "docker_upload_to_s3=true" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - echo "docker_upload_to_s3=true" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=latest" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=latest" >> $GITHUB_OUTPUT + elif [ "${{ env.TARGET_BRANCH }}" == "preview" ] || [ "${{ env.TARGET_BRANCH }}" == "develop" ]; then + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT else - echo "docker_upload_to_s3=false" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=false" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=$BR_NAME" >> $GITHUB_OUTPUT fi - id: checkout_files @@ -67,7 +71,7 @@ jobs: uses: tj-actions/changed-files@v42 with: files_yaml: | - frontend: + web: - web/** - packages/** - 'package.json' @@ -87,11 +91,11 @@ jobs: - nginx/** branch_build_push_frontend: - if: ${{ needs.branch_build_setup.outputs.build_frontend == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_web == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -101,11 +105,16 @@ jobs: - name: Set Frontend Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:latest else TAG=${{ env.FRONTEND_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "FRONTEND_TAG=${TAG}" >> $GITHUB_ENV @@ -115,6 +124,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -139,11 +155,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_space: - if: ${{ needs.branch_build_setup.outputs.build_space == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_space == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -153,11 +169,16 @@ jobs: - name: Set Space Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:latest else TAG=${{ env.SPACE_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "SPACE_TAG=${TAG}" >> $GITHUB_ENV @@ -167,6 +188,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -191,11 +219,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_backend: - if: ${{ needs.branch_build_setup.outputs.build_backend == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_backend == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -205,11 +233,16 @@ jobs: - name: Set Backend Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:latest else TAG=${{ env.BACKEND_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "BACKEND_TAG=${TAG}" >> $GITHUB_ENV @@ -219,6 +252,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -243,11 +283,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_proxy: - if: ${{ needs.branch_build_setup.outputs.build_proxy == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_proxy == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -257,11 +297,16 @@ jobs: - name: Set Proxy Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:latest else TAG=${{ env.PROXY_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "PROXY_TAG=${TAG}" >> $GITHUB_ENV @@ -271,6 +316,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -294,25 +346,33 @@ jobs: DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - convert_docker_to_tar: - if: ${{ needs.branch_build_setup.outputs.docker_upload_to_s3 == 'true' }} + upload_assets_s3: + if: ${{ needs.branch_build_setup.outputs.artifact_upload_to_s3 == 'true' }} name: Convert Docker TAR to S3 Bucket runs-on: ubuntu-latest - needs: [branch_build_setup, branch_build_push_frontend, branch_build_push_space, branch_build_push_backend, branch_build_push_proxy] + needs: + [ + branch_build_setup, + branch_build_push_frontend, + branch_build_push_space, + branch_build_push_backend, + branch_build_push_proxy, + ] container: image: docker:20.10.7 credentials: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} env: - TAR_SUFFIX: ${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} + TAR_SUFFIX: ${{ needs.branch_build_setup.outputs.artifact_s3_suffix }} AWS_ACCESS_KEY_ID: ${{ secrets.PLANE_DOCKER_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.PLANE_DOCKER_SECRET_ACCESS_KEY }} + TARGET_BRANCH: ${{ github.ref_name || github.event.release.target_commitish }} steps: + - id: checkout_files + name: Checkout Files + uses: actions/checkout@v4 + - name: Save Image as Tar run: | apk update @@ -320,21 +380,11 @@ jobs: mkdir -p ~/${{ env.TAR_SUFFIX }} - echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + cp deploy/cli-install/variables.env ~/${{ env.TAR_SUFFIX }}/variables.env + cp deploy/cli-install/Caddyfile ~/${{ env.TAR_SUFFIX }}/Caddyfile + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.TAR_SUFFIX }}'@' deploy/cli-install/docker-compose.yml > ~/${{ env.TAR_SUFFIX }}/docker-compose.yml + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.TAR_SUFFIX }}'@' deploy/cli-install/docker-compose-caddy.yml > ~/${{ env.TAR_SUFFIX }}/docker-compose-caddy.yml - docker pull ${{ env.FRONTEND_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-frontend-ee.tar ${{ env.FRONTEND_TAG }} - - docker pull ${{ env.SPACE_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-space-ee.tar ${{ env.SPACE_TAG }} - - docker pull ${{ env.BACKEND_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-backend-ee.tar ${{ env.BACKEND_TAG }} - - docker pull ${{ env.PROXY_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-proxy-ee.tar ${{ env.PROXY_TAG }} - - aws s3 cp ~/${{ env.TAR_SUFFIX }} s3://${{ secrets.PLANE_DOCKER_BUCKET }}/plane-ee/${{ env.TAR_SUFFIX }} --recursive + aws s3 cp ~/${{ env.TAR_SUFFIX }} s3://${{ secrets.PLANE_DOCKER_BUCKET }}/plane-enterprise/${{ env.TAR_SUFFIX }} --recursive rm -rf ~/${{ env.TAR_SUFFIX }} - \ No newline at end of file From 504346bbbbe3c66d48b38f5d09d56ce9358a9eaa Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 26 Apr 2024 18:07:55 +0530 Subject: [PATCH 07/13] fix: renaming and updates --- .github/workflows/build-branch-ee.yml | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-branch-ee.yml b/.github/workflows/build-branch-ee.yml index a512ffa876..6f8072ea93 100644 --- a/.github/workflows/build-branch-ee.yml +++ b/.github/workflows/build-branch-ee.yml @@ -90,19 +90,19 @@ jobs: proxy: - nginx/** - branch_build_push_frontend: + branch_build_push_web: if: ${{ needs.branch_build_setup.outputs.build_web == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} + WEB_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Frontend Docker Tag + - name: Set Web Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:stable @@ -113,10 +113,10 @@ jobs: TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:latest TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:latest else - TAG=${{ env.FRONTEND_TAG }} + TAG=${{ env.WEB_TAG }} TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi - echo "FRONTEND_TAG=${TAG}" >> $GITHUB_ENV + echo "WEB_TAG=${TAG}" >> $GITHUB_ENV - name: Login to Docker Hub uses: docker/login-action@v3 @@ -141,13 +141,13 @@ jobs: - name: Check out the repo uses: actions/checkout@v4 - - name: Build and Push Frontend to Docker Container Registry + - name: Build and Push Web to Docker Container Registry uses: docker/build-push-action@v5.1.0 with: context: . file: ./web/Dockerfile.web platforms: ${{ env.BUILDX_PLATFORMS }} - tags: ${{ env.FRONTEND_TAG }} + tags: ${{ env.WEB_TAG }} push: true env: DOCKER_BUILDKIT: 1 @@ -346,14 +346,14 @@ jobs: DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - upload_assets_s3: + upload_artifacts_s3: if: ${{ needs.branch_build_setup.outputs.artifact_upload_to_s3 == 'true' }} - name: Convert Docker TAR to S3 Bucket + name: Upload artifacts to S3 Bucket runs-on: ubuntu-latest needs: [ branch_build_setup, - branch_build_push_frontend, + branch_build_push_web, branch_build_push_space, branch_build_push_backend, branch_build_push_proxy, @@ -364,27 +364,27 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} env: - TAR_SUFFIX: ${{ needs.branch_build_setup.outputs.artifact_s3_suffix }} - AWS_ACCESS_KEY_ID: ${{ secrets.PLANE_DOCKER_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.PLANE_DOCKER_SECRET_ACCESS_KEY }} + ARTIFACT_SUFFIX: ${{ needs.branch_build_setup.outputs.artifact_s3_suffix }} + AWS_ACCESS_KEY_ID: ${{ secrets.SELF_HOST_BUCKET_ACCESS_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.SELF_HOST_BUCKET_SECRET_KEY }} TARGET_BRANCH: ${{ github.ref_name || github.event.release.target_commitish }} steps: - id: checkout_files name: Checkout Files uses: actions/checkout@v4 - - name: Save Image as Tar + - name: Upload artifacts run: | apk update apk add --no-cache aws-cli - mkdir -p ~/${{ env.TAR_SUFFIX }} + mkdir -p ~/${{ env.ARTIFACT_SUFFIX }} - cp deploy/cli-install/variables.env ~/${{ env.TAR_SUFFIX }}/variables.env - cp deploy/cli-install/Caddyfile ~/${{ env.TAR_SUFFIX }}/Caddyfile - sed -e 's@${APP_RELEASE_VERSION}@'${{ env.TAR_SUFFIX }}'@' deploy/cli-install/docker-compose.yml > ~/${{ env.TAR_SUFFIX }}/docker-compose.yml - sed -e 's@${APP_RELEASE_VERSION}@'${{ env.TAR_SUFFIX }}'@' deploy/cli-install/docker-compose-caddy.yml > ~/${{ env.TAR_SUFFIX }}/docker-compose-caddy.yml + cp deploy/cli-install/variables.env ~/${{ env.ARTIFACT_SUFFIX }}/variables.env + cp deploy/cli-install/Caddyfile ~/${{ env.ARTIFACT_SUFFIX }}/Caddyfile + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.ARTIFACT_SUFFIX }}'@' deploy/cli-install/docker-compose.yml > ~/${{ env.ARTIFACT_SUFFIX }}/docker-compose.yml + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.ARTIFACT_SUFFIX }}'@' deploy/cli-install/docker-compose-caddy.yml > ~/${{ env.ARTIFACT_SUFFIX }}/docker-compose-caddy.yml - aws s3 cp ~/${{ env.TAR_SUFFIX }} s3://${{ secrets.PLANE_DOCKER_BUCKET }}/plane-enterprise/${{ env.TAR_SUFFIX }} --recursive + aws s3 cp ~/${{ env.ARTIFACT_SUFFIX }} s3://${{ vars.SELF_HOST_BUCKET_NAME }}/plane-enterprise/${{ env.ARTIFACT_SUFFIX }} --recursive - rm -rf ~/${{ env.TAR_SUFFIX }} + rm -rf ~/${{ env.ARTIFACT_SUFFIX }} From 49d1bd05648ce6d235b646ca43541f688e4911dd Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 26 Apr 2024 18:18:31 +0530 Subject: [PATCH 08/13] fix: update docker compose changes --- deploy/cli-install/docker-compose-caddy.yml | 24 ++++++++++----------- deploy/cli-install/docker-compose.yml | 18 ++++++++-------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/deploy/cli-install/docker-compose-caddy.yml b/deploy/cli-install/docker-compose-caddy.yml index 01c370a8e2..e96d092df7 100644 --- a/deploy/cli-install/docker-compose-caddy.yml +++ b/deploy/cli-install/docker-compose-caddy.yml @@ -1,15 +1,15 @@ -x-proxy-env : &proxy-env +x-proxy-env: &proxy-env environment: - DOMAIN_NAME=${DOMAIN_NAME:-localhost} - CERT_EMAIL=${CERT_EMAIL:-admin@localhost} - APP_PROTOCOL=${APP_PROTOCOL:-http} - - CERT_ACME_DNS=${CERT_ACME_DNS:-} + - CERT_ACME_DNS=${CERT_ACME_DNS:-} - BUCKET_NAME=${BUCKET_NAME:-uploads} - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} - LISTEN_HTTP_PORT=${LISTEN_HTTP_PORT:-80} - LISTEN_HTTPS_PORT=${LISTEN_HTTPS_PORT:-443} -x-app-env : &app-env +x-app-env: &app-env environment: - NGINX_PORT=${NGINX_PORT:-80} - WEB_URL=${WEB_URL:-http://localhost} @@ -48,7 +48,7 @@ x-app-env : &app-env services: web: <<: *app-env - image: registry.plane.tools/plane-one/plane-frontend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/web-enterprise:${APP_RELEASE_VERSION} restart: unless-stopped command: /usr/local/bin/start.sh web/server.js web deploy: @@ -59,7 +59,7 @@ services: space: <<: *app-env - image: registry.plane.tools/plane-one/plane-space-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/space-enterprise:${APP_RELEASE_VERSION} restart: unless-stopped command: /usr/local/bin/start.sh space/server.js space deploy: @@ -71,7 +71,7 @@ services: api: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} restart: unless-stopped command: ./bin/takeoff deploy: @@ -84,7 +84,7 @@ services: worker: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} restart: unless-stopped command: ./bin/worker # volumes: @@ -96,7 +96,7 @@ services: beat-worker: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} restart: unless-stopped command: ./bin/beat # volumes: @@ -108,7 +108,7 @@ services: migrator: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} restart: no command: > sh -c "python manage.py wait_for_db && @@ -126,7 +126,7 @@ services: command: postgres -c 'max_connections=1000' volumes: - ${INSTALL_DIR}/data/db:/var/lib/postgresql/data - + plane-redis: <<: *app-env image: redis:7.2.4-alpine @@ -149,8 +149,8 @@ services: image: makeplane/caddy:latest restart: unless-stopped ports: - - ${LISTEN_HTTP_PORT:-80}:80 - - ${LISTEN_HTTPS_PORT:-443}:443 + - ${LISTEN_HTTP_PORT:-80}:80 + - ${LISTEN_HTTPS_PORT:-443}:443 volumes: - ${INSTALL_DIR}/Caddyfile:/etc/caddy/Caddyfile - ${INSTALL_DIR}/caddy/config:/config diff --git a/deploy/cli-install/docker-compose.yml b/deploy/cli-install/docker-compose.yml index 602eda169e..b0ea017f3a 100644 --- a/deploy/cli-install/docker-compose.yml +++ b/deploy/cli-install/docker-compose.yml @@ -1,6 +1,6 @@ # version: "3.8" -x-app-env : &app-env +x-app-env: &app-env environment: - NGINX_PORT=${NGINX_PORT:-80} - WEB_URL=${WEB_URL:-http://localhost} @@ -39,7 +39,7 @@ x-app-env : &app-env services: web: <<: *app-env - image: registry.plane.tools/plane-one/plane-frontend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/web-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped command: /usr/local/bin/start.sh web/server.js web @@ -51,7 +51,7 @@ services: space: <<: *app-env - image: registry.plane.tools/plane-one/plane-space-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/space-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped command: /usr/local/bin/start.sh space/server.js space @@ -64,7 +64,7 @@ services: api: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped command: ./bin/takeoff @@ -78,7 +78,7 @@ services: worker: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped command: ./bin/worker @@ -91,7 +91,7 @@ services: beat-worker: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped command: ./bin/beat @@ -104,7 +104,7 @@ services: migrator: <<: *app-env - image: registry.plane.tools/plane-one/plane-backend-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: no command: > @@ -145,11 +145,11 @@ services: # Comment this if you already have a reverse proxy running proxy: <<: *app-env - image: registry.plane.tools/plane-one/plane-proxy-one:${APP_RELEASE_VERSION} + image: registry.plane.tools/plane-enterprise/proxy-enterprise:${APP_RELEASE_VERSION} pull_policy: if_not_present restart: unless-stopped ports: - - ${NGINX_PORT}:80 + - ${NGINX_PORT}:80 depends_on: - web - api From f87bb95236311d7600584b6701df7447b635cade Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:27:32 +0530 Subject: [PATCH 09/13] chore: clear search term on escape key (#4289) --- web/components/command-palette/command-modal.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/components/command-palette/command-modal.tsx b/web/components/command-palette/command-modal.tsx index aa36eabed7..29734efc9d 100644 --- a/web/components/command-palette/command-modal.tsx +++ b/web/components/command-palette/command-modal.tsx @@ -178,7 +178,9 @@ export const CommandModal: React.FC = observer(() => { return 0; }} onKeyDown={(e) => { - // when search is empty and page is undefined + // when search term is not empty, esc should clear the search term + if (e.key === "Escape" && searchTerm) setSearchTerm(""); + // when user tries to close the modal with esc if (e.key === "Escape" && !page && !searchTerm) closePalette(); From ad27184a91a72905a4b32a9f6b3ad7cea43d8475 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:29:18 +0530 Subject: [PATCH 10/13] [WEB-1072] fix: pages UI improvements (#4294) * fix: outline alignment * fix: textarea auto-resize logic --- packages/ui/src/form-fields/textarea.tsx | 2 +- .../ui/src/hooks/use-auto-resize-textarea.ts | 30 +++++++------------ .../editor/summary/heading-components.tsx | 6 ++-- web/components/pages/editor/title.tsx | 11 +++++-- web/components/pages/list/block.tsx | 2 +- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/packages/ui/src/form-fields/textarea.tsx b/packages/ui/src/form-fields/textarea.tsx index 2c47a65f57..e6927a9682 100644 --- a/packages/ui/src/form-fields/textarea.tsx +++ b/packages/ui/src/form-fields/textarea.tsx @@ -15,7 +15,7 @@ const TextArea = React.forwardRef((props, re // refs const textAreaRef = useRef(ref); // auto re-size - useAutoResizeTextArea(textAreaRef); + useAutoResizeTextArea(textAreaRef, value); return (