mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
fix: resolved merge conflicts while moving changes from preview to develop
This commit is contained in:
commit
13362590b6
10
.env.example
10
.env.example
@ -1,14 +1,12 @@
|
|||||||
# Database Settings
|
# Database Settings
|
||||||
PGUSER="plane"
|
POSTGRES_USER="plane"
|
||||||
PGPASSWORD="plane"
|
POSTGRES_PASSWORD="plane"
|
||||||
PGHOST="plane-db"
|
POSTGRES_DB="plane"
|
||||||
PGDATABASE="plane"
|
PGDATA="/var/lib/postgresql/data"
|
||||||
DATABASE_URL=postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}/${PGDATABASE}
|
|
||||||
|
|
||||||
# Redis Settings
|
# Redis Settings
|
||||||
REDIS_HOST="plane-redis"
|
REDIS_HOST="plane-redis"
|
||||||
REDIS_PORT="6379"
|
REDIS_PORT="6379"
|
||||||
REDIS_URL="redis://${REDIS_HOST}:6379/"
|
|
||||||
|
|
||||||
# AWS Settings
|
# AWS Settings
|
||||||
AWS_REGION=""
|
AWS_REGION=""
|
||||||
|
@ -63,7 +63,7 @@ Thats it!
|
|||||||
|
|
||||||
## 🍙 Self Hosting
|
## 🍙 Self Hosting
|
||||||
|
|
||||||
For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/self-hosting/docker-compose) documentation page
|
For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/docker-compose) documentation page
|
||||||
|
|
||||||
## 🚀 Features
|
## 🚀 Features
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@ from plane.db.models import (
|
|||||||
User,
|
User,
|
||||||
IssueProperty,
|
IssueProperty,
|
||||||
)
|
)
|
||||||
from plane.bgtasks.user_welcome_task import send_welcome_slack
|
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
@ -55,15 +54,6 @@ def service_importer(service, importer_id):
|
|||||||
ignore_conflicts=True,
|
ignore_conflicts=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
_ = [
|
|
||||||
send_welcome_slack.delay(
|
|
||||||
str(user.id),
|
|
||||||
True,
|
|
||||||
f"{user.email} was imported to Plane from {service}",
|
|
||||||
)
|
|
||||||
for user in new_users
|
|
||||||
]
|
|
||||||
|
|
||||||
workspace_users = User.objects.filter(
|
workspace_users = User.objects.filter(
|
||||||
email__in=[
|
email__in=[
|
||||||
user.get("email").strip().lower()
|
user.get("email").strip().lower()
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
# Django imports
|
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
# Third party imports
|
|
||||||
from celery import shared_task
|
|
||||||
from sentry_sdk import capture_exception
|
|
||||||
from slack_sdk import WebClient
|
|
||||||
from slack_sdk.errors import SlackApiError
|
|
||||||
|
|
||||||
# Module imports
|
|
||||||
from plane.db.models import User
|
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
|
||||||
def send_welcome_slack(user_id, created, message):
|
|
||||||
try:
|
|
||||||
instance = User.objects.get(pk=user_id)
|
|
||||||
|
|
||||||
if created and not instance.is_bot:
|
|
||||||
# Send message on slack as well
|
|
||||||
if settings.SLACK_BOT_TOKEN:
|
|
||||||
client = WebClient(token=settings.SLACK_BOT_TOKEN)
|
|
||||||
try:
|
|
||||||
_ = client.chat_postMessage(
|
|
||||||
channel="#trackers",
|
|
||||||
text=message,
|
|
||||||
)
|
|
||||||
except SlackApiError as e:
|
|
||||||
print(f"Got an error: {e.response['error']}")
|
|
||||||
return
|
|
||||||
except Exception as e:
|
|
||||||
# Print logs if in DEBUG mode
|
|
||||||
if settings.DEBUG:
|
|
||||||
print(e)
|
|
||||||
capture_exception(e)
|
|
||||||
return
|
|
@ -82,17 +82,6 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor):
|
|||||||
msg.attach_alternative(html_content, "text/html")
|
msg.attach_alternative(html_content, "text/html")
|
||||||
msg.send()
|
msg.send()
|
||||||
|
|
||||||
# Send message on slack as well
|
|
||||||
if settings.SLACK_BOT_TOKEN:
|
|
||||||
client = WebClient(token=settings.SLACK_BOT_TOKEN)
|
|
||||||
try:
|
|
||||||
_ = client.chat_postMessage(
|
|
||||||
channel="#trackers",
|
|
||||||
text=f"{workspace_member_invite.email} has been invited to {workspace.name} as a {workspace_member_invite.role}",
|
|
||||||
)
|
|
||||||
except SlackApiError as e:
|
|
||||||
print(f"Got an error: {e.response['error']}")
|
|
||||||
|
|
||||||
return
|
return
|
||||||
except (Workspace.DoesNotExist, WorkspaceMemberInvite.DoesNotExist) as e:
|
except (Workspace.DoesNotExist, WorkspaceMemberInvite.DoesNotExist) as e:
|
||||||
print("Workspace or WorkspaceMember Invite Does not exists")
|
print("Workspace or WorkspaceMember Invite Does not exists")
|
||||||
|
@ -6,20 +6,12 @@ import pytz
|
|||||||
|
|
||||||
# Django imports
|
# Django imports
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.signals import post_save
|
|
||||||
from django.dispatch import receiver
|
|
||||||
from django.contrib.auth.models import (
|
from django.contrib.auth.models import (
|
||||||
AbstractBaseUser,
|
AbstractBaseUser,
|
||||||
UserManager,
|
UserManager,
|
||||||
PermissionsMixin,
|
PermissionsMixin,
|
||||||
)
|
)
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
# Third party imports
|
|
||||||
from sentry_sdk import capture_exception
|
|
||||||
from slack_sdk import WebClient
|
|
||||||
from slack_sdk.errors import SlackApiError
|
|
||||||
|
|
||||||
|
|
||||||
def get_default_onboarding():
|
def get_default_onboarding():
|
||||||
@ -142,23 +134,3 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|||||||
self.is_staff = True
|
self.is_staff = True
|
||||||
|
|
||||||
super(User, self).save(*args, **kwargs)
|
super(User, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=User)
|
|
||||||
def send_welcome_slack(sender, instance, created, **kwargs):
|
|
||||||
try:
|
|
||||||
if created and not instance.is_bot:
|
|
||||||
# Send message on slack as well
|
|
||||||
if settings.SLACK_BOT_TOKEN:
|
|
||||||
client = WebClient(token=settings.SLACK_BOT_TOKEN)
|
|
||||||
try:
|
|
||||||
_ = client.chat_postMessage(
|
|
||||||
channel="#trackers",
|
|
||||||
text=f"New user {instance.email} has signed up and begun the onboarding journey.",
|
|
||||||
)
|
|
||||||
except SlackApiError as e:
|
|
||||||
print(f"Got an error: {e.response['error']}")
|
|
||||||
return
|
|
||||||
except Exception as e:
|
|
||||||
capture_exception(e)
|
|
||||||
return
|
|
||||||
|
@ -314,7 +314,7 @@ if bool(os.environ.get("SENTRY_DSN", False)) and os.environ.get(
|
|||||||
|
|
||||||
# Application Envs
|
# Application Envs
|
||||||
PROXY_BASE_URL = os.environ.get("PROXY_BASE_URL", False) # For External
|
PROXY_BASE_URL = os.environ.get("PROXY_BASE_URL", False) # For External
|
||||||
SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN", False)
|
|
||||||
FILE_SIZE_LIMIT = int(os.environ.get("FILE_SIZE_LIMIT", 5242880))
|
FILE_SIZE_LIMIT = int(os.environ.get("FILE_SIZE_LIMIT", 5242880))
|
||||||
|
|
||||||
# Unsplash Access key
|
# Unsplash Access key
|
||||||
|
26
deploy/selfhost/build.yml
Normal file
26
deploy/selfhost/build.yml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: ${DOCKERHUB_USER:-local}/plane-frontend:${APP_RELEASE:-latest}
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: ./web/Dockerfile.web
|
||||||
|
|
||||||
|
space:
|
||||||
|
image: ${DOCKERHUB_USER:-local}/plane-space:${APP_RELEASE:-latest}
|
||||||
|
build:
|
||||||
|
context: ./
|
||||||
|
dockerfile: ./space/Dockerfile.space
|
||||||
|
|
||||||
|
api:
|
||||||
|
image: ${DOCKERHUB_USER:-local}/plane-backend:${APP_RELEASE:-latest}
|
||||||
|
build:
|
||||||
|
context: ./apiserver
|
||||||
|
dockerfile: ./Dockerfile.api
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
image: ${DOCKERHUB_USER:-local}/plane-proxy:${APP_RELEASE:-latest}
|
||||||
|
build:
|
||||||
|
context: ./nginx
|
||||||
|
dockerfile: ./Dockerfile
|
@ -65,8 +65,8 @@ x-app-env : &app-env
|
|||||||
services:
|
services:
|
||||||
web:
|
web:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-frontend:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-frontend:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: /usr/local/bin/start.sh web/server.js web
|
command: /usr/local/bin/start.sh web/server.js web
|
||||||
deploy:
|
deploy:
|
||||||
@ -77,8 +77,8 @@ services:
|
|||||||
|
|
||||||
space:
|
space:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-space:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-space:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: /usr/local/bin/start.sh space/server.js space
|
command: /usr/local/bin/start.sh space/server.js space
|
||||||
deploy:
|
deploy:
|
||||||
@ -90,8 +90,8 @@ services:
|
|||||||
|
|
||||||
api:
|
api:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-backend:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: ./bin/takeoff
|
command: ./bin/takeoff
|
||||||
deploy:
|
deploy:
|
||||||
@ -102,8 +102,8 @@ services:
|
|||||||
|
|
||||||
worker:
|
worker:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-backend:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: ./bin/worker
|
command: ./bin/worker
|
||||||
depends_on:
|
depends_on:
|
||||||
@ -113,8 +113,8 @@ services:
|
|||||||
|
|
||||||
beat-worker:
|
beat-worker:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-backend:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: ./bin/beat
|
command: ./bin/beat
|
||||||
depends_on:
|
depends_on:
|
||||||
@ -125,6 +125,7 @@ services:
|
|||||||
plane-db:
|
plane-db:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
image: postgres:15.2-alpine
|
image: postgres:15.2-alpine
|
||||||
|
pull_policy: if_not_present
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: postgres -c 'max_connections=1000'
|
command: postgres -c 'max_connections=1000'
|
||||||
volumes:
|
volumes:
|
||||||
@ -133,6 +134,7 @@ services:
|
|||||||
plane-redis:
|
plane-redis:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
image: redis:6.2.7-alpine
|
image: redis:6.2.7-alpine
|
||||||
|
pull_policy: if_not_present
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- redisdata:/data
|
- redisdata:/data
|
||||||
@ -140,6 +142,7 @@ services:
|
|||||||
plane-minio:
|
plane-minio:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
image: minio/minio
|
image: minio/minio
|
||||||
|
pull_policy: if_not_present
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: server /export --console-address ":9090"
|
command: server /export --console-address ":9090"
|
||||||
volumes:
|
volumes:
|
||||||
@ -148,8 +151,8 @@ services:
|
|||||||
# Comment this if you already have a reverse proxy running
|
# Comment this if you already have a reverse proxy running
|
||||||
proxy:
|
proxy:
|
||||||
<<: *app-env
|
<<: *app-env
|
||||||
platform: linux/amd64
|
image: ${DOCKERHUB_USER:-makeplane}/plane-proxy:${APP_RELEASE:-latest}
|
||||||
image: makeplane/plane-proxy:${APP_RELEASE:-latest}
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
ports:
|
ports:
|
||||||
- ${NGINX_PORT}:80
|
- ${NGINX_PORT}:80
|
||||||
depends_on:
|
depends_on:
|
||||||
|
@ -3,13 +3,75 @@
|
|||||||
BRANCH=master
|
BRANCH=master
|
||||||
SCRIPT_DIR=$PWD
|
SCRIPT_DIR=$PWD
|
||||||
PLANE_INSTALL_DIR=$PWD/plane-app
|
PLANE_INSTALL_DIR=$PWD/plane-app
|
||||||
|
export APP_RELEASE=$BRANCH
|
||||||
|
export DOCKERHUB_USER=makeplane
|
||||||
|
export PULL_POLICY=always
|
||||||
|
USE_GLOBAL_IMAGES=1
|
||||||
|
|
||||||
function install(){
|
RED='\033[0;31m'
|
||||||
echo
|
YELLOW='\033[1;33m'
|
||||||
echo "Installing on $PLANE_INSTALL_DIR"
|
GREEN='\033[0;32m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
function buildLocalImage() {
|
||||||
|
if [ "$1" == "--force-build" ]; then
|
||||||
|
DO_BUILD="1"
|
||||||
|
elif [ "$1" == "--skip-build" ]; then
|
||||||
|
DO_BUILD="2"
|
||||||
|
else
|
||||||
|
printf "\n" >&2
|
||||||
|
printf "${YELLOW}You are on ${ARCH} cpu architecture. ${NC}\n" >&2
|
||||||
|
printf "${YELLOW}Since the prebuilt ${ARCH} compatible docker images are not available for, we will be running the docker build on this system. ${NC} \n" >&2
|
||||||
|
printf "${YELLOW}This might take ${YELLOW}5-30 min based on your system's hardware configuration. \n ${NC} \n" >&2
|
||||||
|
printf "\n" >&2
|
||||||
|
printf "${GREEN}Select an option to proceed: ${NC}\n" >&2
|
||||||
|
printf " 1) Build Fresh Images \n" >&2
|
||||||
|
printf " 2) Skip Building Images \n" >&2
|
||||||
|
printf " 3) Exit \n" >&2
|
||||||
|
printf "\n" >&2
|
||||||
|
read -p "Select Option [1]: " DO_BUILD
|
||||||
|
until [[ -z "$DO_BUILD" || "$DO_BUILD" =~ ^[1-3]$ ]]; do
|
||||||
|
echo "$DO_BUILD: invalid selection." >&2
|
||||||
|
read -p "Select Option [1]: " DO_BUILD
|
||||||
|
done
|
||||||
|
echo "" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DO_BUILD" == "1" ] || [ "$DO_BUILD" == "" ];
|
||||||
|
then
|
||||||
|
REPO=https://github.com/makeplane/plane.git
|
||||||
|
CURR_DIR=$PWD
|
||||||
|
PLANE_TEMP_CODE_DIR=$(mktemp -d)
|
||||||
|
git clone $REPO $PLANE_TEMP_CODE_DIR --branch $BRANCH --single-branch
|
||||||
|
|
||||||
|
cp $PLANE_TEMP_CODE_DIR/deploy/selfhost/build.yml $PLANE_TEMP_CODE_DIR/build.yml
|
||||||
|
|
||||||
|
cd $PLANE_TEMP_CODE_DIR
|
||||||
|
if [ "$BRANCH" == "master" ];
|
||||||
|
then
|
||||||
|
APP_RELEASE=latest
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker compose -f build.yml build --no-cache >&2
|
||||||
|
# cd $CURR_DIR
|
||||||
|
# rm -rf $PLANE_TEMP_CODE_DIR
|
||||||
|
echo "build_completed"
|
||||||
|
elif [ "$DO_BUILD" == "2" ];
|
||||||
|
then
|
||||||
|
printf "${YELLOW}Build action skipped by you in lieu of using existing images. ${NC} \n" >&2
|
||||||
|
echo "build_skipped"
|
||||||
|
elif [ "$DO_BUILD" == "3" ];
|
||||||
|
then
|
||||||
|
echo "build_exited"
|
||||||
|
else
|
||||||
|
printf "INVALID OPTION SUPPLIED" >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function install() {
|
||||||
|
echo "Installing Plane.........."
|
||||||
download
|
download
|
||||||
}
|
}
|
||||||
function download(){
|
function download() {
|
||||||
cd $SCRIPT_DIR
|
cd $SCRIPT_DIR
|
||||||
TS=$(date +%s)
|
TS=$(date +%s)
|
||||||
if [ -f "$PLANE_INSTALL_DIR/docker-compose.yaml" ]
|
if [ -f "$PLANE_INSTALL_DIR/docker-compose.yaml" ]
|
||||||
@ -35,6 +97,21 @@ function download(){
|
|||||||
|
|
||||||
rm $PLANE_INSTALL_DIR/temp.yaml
|
rm $PLANE_INSTALL_DIR/temp.yaml
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ $USE_GLOBAL_IMAGES == 0 ]; then
|
||||||
|
local res=$(buildLocalImage)
|
||||||
|
# echo $res
|
||||||
|
|
||||||
|
if [ "$res" == "build_exited" ];
|
||||||
|
then
|
||||||
|
echo
|
||||||
|
echo "Install action cancelled by you. Exiting now."
|
||||||
|
echo
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
docker compose -f $PLANE_INSTALL_DIR/docker-compose.yaml pull
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Latest version is now available for you to use"
|
echo "Latest version is now available for you to use"
|
||||||
@ -43,22 +120,22 @@ function download(){
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
}
|
}
|
||||||
function startServices(){
|
function startServices() {
|
||||||
cd $PLANE_INSTALL_DIR
|
cd $PLANE_INSTALL_DIR
|
||||||
docker compose up -d
|
docker compose up -d --quiet-pull
|
||||||
cd $SCRIPT_DIR
|
cd $SCRIPT_DIR
|
||||||
}
|
}
|
||||||
function stopServices(){
|
function stopServices() {
|
||||||
cd $PLANE_INSTALL_DIR
|
cd $PLANE_INSTALL_DIR
|
||||||
docker compose down
|
docker compose down
|
||||||
cd $SCRIPT_DIR
|
cd $SCRIPT_DIR
|
||||||
}
|
}
|
||||||
function restartServices(){
|
function restartServices() {
|
||||||
cd $PLANE_INSTALL_DIR
|
cd $PLANE_INSTALL_DIR
|
||||||
docker compose restart
|
docker compose restart
|
||||||
cd $SCRIPT_DIR
|
cd $SCRIPT_DIR
|
||||||
}
|
}
|
||||||
function upgrade(){
|
function upgrade() {
|
||||||
echo "***** STOPPING SERVICES ****"
|
echo "***** STOPPING SERVICES ****"
|
||||||
stopServices
|
stopServices
|
||||||
|
|
||||||
@ -69,10 +146,10 @@ function upgrade(){
|
|||||||
echo "***** PLEASE VALIDATE AND START SERVICES ****"
|
echo "***** PLEASE VALIDATE AND START SERVICES ****"
|
||||||
|
|
||||||
}
|
}
|
||||||
function askForAction(){
|
function askForAction() {
|
||||||
echo
|
echo
|
||||||
echo "Select a Action you want to perform:"
|
echo "Select a Action you want to perform:"
|
||||||
echo " 1) Install"
|
echo " 1) Install (${ARCH})"
|
||||||
echo " 2) Start"
|
echo " 2) Start"
|
||||||
echo " 3) Stop"
|
echo " 3) Stop"
|
||||||
echo " 4) Restart"
|
echo " 4) Restart"
|
||||||
@ -115,6 +192,20 @@ function askForAction(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# CPU ARCHITECHTURE BASED SETTINGS
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ $ARCH == "amd64" ] || [ $ARCH == "x86_64" ];
|
||||||
|
then
|
||||||
|
USE_GLOBAL_IMAGES=1
|
||||||
|
DOCKERHUB_USER=makeplane
|
||||||
|
PULL_POLICY=always
|
||||||
|
else
|
||||||
|
USE_GLOBAL_IMAGES=0
|
||||||
|
DOCKERHUB_USER=myplane
|
||||||
|
PULL_POLICY=never
|
||||||
|
fi
|
||||||
|
|
||||||
|
# REMOVE SPECIAL CHARACTERS FROM BRANCH NAME
|
||||||
if [ "$BRANCH" != "master" ];
|
if [ "$BRANCH" != "master" ];
|
||||||
then
|
then
|
||||||
PLANE_INSTALL_DIR=$PWD/plane-app-$(echo $BRANCH | sed -r 's@(\/|" "|\.)@-@g')
|
PLANE_INSTALL_DIR=$PWD/plane-app-$(echo $BRANCH | sed -r 's@(\/|" "|\.)@-@g')
|
||||||
|
@ -50,7 +50,7 @@ export const CycleLayoutRoot: React.FC = observer(() => {
|
|||||||
const activeLayout = issuesFilter?.issueFilters?.displayFilters?.layout;
|
const activeLayout = issuesFilter?.issueFilters?.displayFilters?.layout;
|
||||||
|
|
||||||
const cycleDetails = cycleId ? getCycleById(cycleId.toString()) : undefined;
|
const cycleDetails = cycleId ? getCycleById(cycleId.toString()) : undefined;
|
||||||
const cycleStatus = cycleDetails?.status.toLocaleLowerCase() ?? "draft";
|
const cycleStatus = cycleDetails?.status?.toLocaleLowerCase() ?? "draft";
|
||||||
|
|
||||||
if (!workspaceSlug || !projectId || !cycleId) return <></>;
|
if (!workspaceSlug || !projectId || !cycleId) return <></>;
|
||||||
return (
|
return (
|
||||||
|
Loading…
Reference in New Issue
Block a user