diff --git a/.cspell.json b/.cspell.json index 2d252ec5b..e3d1426b9 100644 --- a/.cspell.json +++ b/.cspell.json @@ -20,7 +20,13 @@ "cloudinary", "clsx", "clsxm", + "opentelemetry", + "otlp", "commitlint", + "greenkeeper", + "classpath", + "tsbuildinfo", + "sentryclirc", "compodoc", "consectetur", "dolor", diff --git a/.dockerignore b/.dockerignore index d41865422..269196e49 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,20 +17,26 @@ Jenkinsfile **/.next **/build -**/node_modules/* **/dist **/out **/*.log **/.vscode + +**/.env **/.env.local **/.env*.local +**/.env*.sample +apps/**/.env +apps/**/.env.local +apps/**/.env*.local +apps/**/.env*.sample fly.toml node_modules - +**/node_modules/* apps/mobile/node_modules apps/desktop/node_modules apps/extensions/node_modules diff --git a/.github/workflows/web.dev.yml b/.github/workflows/deploy-vercel-dev.yml similarity index 97% rename from .github/workflows/web.dev.yml rename to .github/workflows/deploy-vercel-dev.yml index 708d06e31..2fee9532f 100644 --- a/.github/workflows/web.dev.yml +++ b/.github/workflows/deploy-vercel-dev.yml @@ -1,4 +1,4 @@ -name: Web Build & Deploy DEV +name: Web Build & Vercel Deploy DEV on: push: branches: diff --git a/.github/workflows/web.prod.yml b/.github/workflows/deploy-vercel-prod.yml similarity index 96% rename from .github/workflows/web.prod.yml rename to .github/workflows/deploy-vercel-prod.yml index e96756ccd..f6b2d4482 100644 --- a/.github/workflows/web.prod.yml +++ b/.github/workflows/deploy-vercel-prod.yml @@ -1,4 +1,4 @@ -name: Web Build & Deploy PROD +name: Web Build & Vercel Deploy PROD on: push: branches: diff --git a/.github/workflows/docker-build-publish-dev.yml b/.github/workflows/docker-build-publish-dev.yml index a62864c77..574fe4cc7 100644 --- a/.github/workflows/docker-build-publish-dev.yml +++ b/.github/workflows/docker-build-publish-dev.yml @@ -11,6 +11,9 @@ concurrency: jobs: ever-teams-webapp: runs-on: buildjet-8vcpu-ubuntu-2204 + + environment: dev + steps: - name: Checkout uses: actions/checkout@v3 @@ -21,6 +24,9 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Output NEXT_PUBLIC_GAUZY_API_SERVER_URL + run: echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}" + - name: Build and push uses: docker/build-push-action@v4 with: @@ -36,6 +42,21 @@ jobs: cache-to: type=inline build-args: | NODE_ENV=development + NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }} + NEXT_PUBLIC_GA_MEASUREMENT_ID=${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }} + NEXT_PUBLIC_CAPTCHA_SITE_KEY=${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }} + NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false + NEXT_PUBLIC_COOKIE_DOMAINS=${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }} + NEXT_PUBLIC_BOARD_APP_DOMAIN=${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }} + NEXT_PUBLIC_BOARD_BACKEND_POST_URL=${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }} + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG=${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }} + NEXT_PUBLIC_MEET_DOMAIN=${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }} + NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }} + NEXT_PUBLIC_SENTRY_DEBUG=${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }} + NEXT_PUBLIC_JITSU_BROWSER_URL=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }} + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }} + NEXT_PUBLIC_GITHUB_APP_NAME=ever-github + NEXT_PUBLIC_CHATWOOT_API_KEY=${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }} - name: Login to DockerHub uses: docker/login-action@v2 diff --git a/.github/workflows/docker-build-publish-prod.yml b/.github/workflows/docker-build-publish-prod.yml index 6addc3242..ad4986543 100644 --- a/.github/workflows/docker-build-publish-prod.yml +++ b/.github/workflows/docker-build-publish-prod.yml @@ -11,6 +11,9 @@ concurrency: jobs: ever-teams-webapp: runs-on: buildjet-8vcpu-ubuntu-2204 + + environment: prod + steps: - name: Checkout uses: actions/checkout@v3 @@ -21,6 +24,9 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Output NEXT_PUBLIC_GAUZY_API_SERVER_URL + run: echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}" + - name: Build and push uses: docker/build-push-action@v4 with: @@ -36,6 +42,21 @@ jobs: cache-to: type=inline build-args: | NODE_ENV=production + NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }} + NEXT_PUBLIC_GA_MEASUREMENT_ID=${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }} + NEXT_PUBLIC_CAPTCHA_SITE_KEY=${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }} + NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false + NEXT_PUBLIC_COOKIE_DOMAINS=${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }} + NEXT_PUBLIC_BOARD_APP_DOMAIN=${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }} + NEXT_PUBLIC_BOARD_BACKEND_POST_URL=${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }} + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG=${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }} + NEXT_PUBLIC_MEET_DOMAIN=${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }} + NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }} + NEXT_PUBLIC_SENTRY_DEBUG=${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }} + NEXT_PUBLIC_JITSU_BROWSER_URL=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }} + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }} + NEXT_PUBLIC_GITHUB_APP_NAME=ever-github + NEXT_PUBLIC_CHATWOOT_API_KEY=${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }} - name: Login to DockerHub uses: docker/login-action@v2 diff --git a/Dockerfile b/Dockerfile index 84f4137b9..8712f6f9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,32 @@ # syntax = docker/dockerfile:1 -# Adjust NODE_VERSION as desired +# Ever Teams Platform + ARG NODE_VERSION=18.17.1 +ARG NEXT_PUBLIC_GAUZY_API_SERVER_URL=https://api.gauzy.co +ARG NEXT_PUBLIC_GA_MEASUREMENT_ID +ARG NEXT_PUBLIC_CAPTCHA_SITE_KEY +ARG NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false +ARG NEXT_PUBLIC_COOKIE_DOMAINS=ever.team +ARG NEXT_PUBLIC_BOARD_APP_DOMAIN=https://board.ever.team +ARG NEXT_PUBLIC_BOARD_BACKEND_POST_URL=https://jsonboard.ever.team/api/v2/post/ +ARG NEXT_PUBLIC_BOARD_FIREBASE_CONFIG +ARG NEXT_PUBLIC_MEET_DOMAIN=https://meet.ever.team +ARG NEXT_PUBLIC_SENTRY_DSN +ARG NEXT_PUBLIC_SENTRY_DEBUG +ARG NEXT_PUBLIC_JITSU_BROWSER_URL +ARG NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY +ARG NEXT_PUBLIC_GITHUB_APP_NAME=ever-github +ARG NEXT_PUBLIC_CHATWOOT_API_KEY + FROM node:${NODE_VERSION}-slim as base +# Output the environment variable value +RUN echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${NEXT_PUBLIC_GAUZY_API_SERVER_URL}" + +LABEL maintainer="ever@ever.co" +LABEL org.opencontainers.image.source https://github.com/ever-co/ever-teams + # Next.js app lives here WORKDIR /app @@ -14,17 +37,33 @@ ENV NEXT_SHARP_PATH=/temp/node_modules/sharp RUN npm i -g npm@latest # Install sharp, NextJS image optimization RUN mkdir /temp && cd /temp && \ - npm i sharp + npm i sharp RUN npm cache clean --force - # Throw-away build stage to reduce size of final image FROM base as build +# We make env vars passed as build argument to be available in this build stage because we prebuild the NextJs app +ARG NEXT_PUBLIC_GAUZY_API_SERVER_URL +ARG NEXT_PUBLIC_GA_MEASUREMENT_ID +ARG NEXT_PUBLIC_CAPTCHA_SITE_KEY +ARG NEXT_PUBLIC_DISABLE_AUTO_REFRESH +ARG NEXT_PUBLIC_COOKIE_DOMAINS +ARG NEXT_PUBLIC_BOARD_APP_DOMAIN +ARG NEXT_PUBLIC_BOARD_BACKEND_POST_URL +ARG NEXT_PUBLIC_BOARD_FIREBASE_CONFIG +ARG NEXT_PUBLIC_MEET_DOMAIN +ARG NEXT_PUBLIC_SENTRY_DSN +ARG NEXT_PUBLIC_SENTRY_DEBUG +ARG NEXT_PUBLIC_JITSU_BROWSER_URL +ARG NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY +ARG NEXT_PUBLIC_GITHUB_APP_NAME +ARG NEXT_PUBLIC_CHATWOOT_API_KEY + # Install packages needed to build node modules RUN apt-get update -qq && \ - apt-get install -y build-essential pkg-config python-is-python3 + apt-get install -y build-essential pkg-config python-is-python3 # Install Yarn RUN npm install -g yarn --force @@ -35,19 +74,21 @@ COPY yarn.lock ./ COPY apps/web/package.json ./apps/web/package.json RUN cd apps/web && \ - yarn install --ignore-scripts + yarn install --ignore-scripts # Copy application code COPY . . ENV NODE_ENV=production +RUN echo $NEXT_PUBLIC_GAUZY_API_SERVER_URL + # Build application RUN yarn run build:web # Remove development dependencies RUN cd apps/web && \ - yarn install --prod --ignore-scripts + yarn install --prod --ignore-scripts RUN yarn cache clean diff --git a/Layerfile b/Layerfile index 26850d39b..5df270bf5 100644 --- a/Layerfile +++ b/Layerfile @@ -11,10 +11,9 @@ RUN apt-get update && \ apt-get update && \ apt-get install docker-ce docker-ce-cli containerd.io -COPY . . +RUN REPEATABLE docker pull everco/ever-teams-webapp -RUN REPEATABLE docker build -t ever-teams . - -RUN REPEATABLE docker run -d -p 3000:3000 ever-teams && sleep 5 +RUN REPEATABLE (docker rm ever-teams --force || true) &&\ + docker run --name ever-teams -d -p 3000:3000 everco/ever-teams-webapp && sleep 5 EXPOSE WEBSITE localhost:3000 diff --git a/Layerfile.build b/Layerfile.build new file mode 100644 index 000000000..13f4cd554 --- /dev/null +++ b/Layerfile.build @@ -0,0 +1,23 @@ +FROM vm/ubuntu:18.04 + +MEMORY 8G + +# install the latest version of Docker, as in the official Docker installation tutorial. +RUN apt-get update && \ + apt-get install ca-certificates curl gnupg lsb-release && \ + sudo mkdir -p /etc/apt/keyrings && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |\ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + apt-get install docker-ce docker-ce-cli containerd.io + +COPY . . + +RUN REPEATABLE docker build -t ever-teams . + +RUN REPEATABLE (docker rm ever-teams --force || true) &&\ + docker run --name ever-teams -d -p 3000:3000 ever-teams && sleep 5 + +EXPOSE WEBSITE localhost:3000 diff --git a/Layerfile.node b/Layerfile.node new file mode 100644 index 000000000..30fd5915e --- /dev/null +++ b/Layerfile.node @@ -0,0 +1,22 @@ +FROM vm/ubuntu:22.04 + +ENV NODE_MAJOR=20 + +# install the latest version of Docker, as in the official Docker installation tutorial. +RUN apt-get update &&\ + apt-get install -y ca-certificates curl gnupg &&\ + sudo mkdir -p /etc/apt/keyrings &&\ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg &&\ + echo \ + "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" |\ + sudo tee /etc/apt/sources.list.d/nodesource.list &&\ + apt-get update &&\ + apt-get install nodejs yarn -y + +COPY . . + +RUN REPEATABLE cd apps/web && yarn install && yarn build + +RUN BACKGROUND yarn start:web + +EXPOSE WEBSITE localhost:3000 diff --git a/README.md b/README.md index d00d7dd6f..6ab23a1fd 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,10 @@ WIP [![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?name=ever-teams&type=docker&builder=dockerfile&image=ghcr.io/ever-co/ever-teams-webapp:latest&env[PORT]=3000&ports=3000;http;/) +### Northflank + +[Deploy to Northflank](https://app.northflank.com/s/account/templates/new?data=656ed069216b5d387f5379c6) + ## 📄 Content - `/web` - NextJs-based (React) Web App at (deployed from `main` branch) diff --git a/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx b/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx index 107dafe59..849dfd31d 100644 --- a/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx +++ b/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx @@ -148,6 +148,7 @@ const TaskMainInfo = observer(() => { > { > { > { > = ({ memberList, task }) => { const assignedToTaskMembers = useMemo( () => memberList?.filter((member) => - member.employee ? task?.members.map((item) => item.userId).includes(member.employee?.userId) : false + member.employee + ? task?.members.map((item) => item.userId).includes(member.employee?.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); @@ -50,7 +53,10 @@ const ManageAssignees: React.FC = ({ memberList, task }) => { const unassignedMembers = useMemo( () => memberList?.filter((member) => - member.employee ? !task?.members.map((item) => item.userId).includes(member.employee.userId) : false + member.employee + ? !task?.members.map((item) => item.userId).includes(member.employee.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); diff --git a/apps/mobile/app/components/TaskPriority.tsx b/apps/mobile/app/components/TaskPriority.tsx index 8a53788e1..e404f983f 100644 --- a/apps/mobile/app/components/TaskPriority.tsx +++ b/apps/mobile/app/components/TaskPriority.tsx @@ -1,53 +1,53 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { typography, useAppTheme } from "../theme" -import TaskPriorityPopup from "./TaskPriorityPopup" -import { translate } from "../i18n" -import { useTaskPriorityValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { typography, useAppTheme } from '../theme'; +import TaskPriorityPopup from './TaskPriorityPopup'; +import { translate } from '../i18n'; +import { useTaskPriorityValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; interface TaskPriorityProps { - task?: ITeamTask - containerStyle?: ViewStyle - priority?: string - setPriority?: (priority: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + priority?: string; + setPriority?: (priority: string) => unknown; + canCreatePriority?: boolean; } const TaskPriority: FC = observer( - ({ task, containerStyle, priority, setPriority }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, priority, setPriority, canCreatePriority }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskPriorities = useTaskPriorityValue() + const allTaskPriorities = useTaskPriorityValue(); const sizeValue = ( - task?.priority?.split("-").join(" ") || - (priority && priority.split("-").join(" ")) - )?.toLowerCase() + task?.priority?.split('-').join(' ') || + (priority && priority.split('-').join(' ')) + )?.toLowerCase(); const currentPriority = - allTaskPriorities && - Object.values(allTaskPriorities).find((item) => item.name.toLowerCase() === sizeValue) + allTaskPriorities && Object.values(allTaskPriorities).find((item) => item.name.toLowerCase() === sizeValue); const onChangePriority = async (text: string) => { if (task) { const taskEdit = { ...task, - priority: task?.priority === text ? null : text, - } + priority: task?.priority === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setPriority(text) + setPriority(text); } - } + }; return ( <> @@ -56,6 +56,7 @@ const TaskPriority: FC = observer( visible={openModal} setSelectedPriority={(e) => onChangePriority(e.value)} onDismiss={() => setOpenModal(false)} + canCreatePriority={canCreatePriority} /> setOpenModal(true)}> = observer( ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: currentPriority?.bgColor, + backgroundColor: currentPriority?.bgColor }} > {(task?.priority || priority) && currentPriority ? ( @@ -72,53 +73,51 @@ const TaskPriority: FC = observer( {limitTextCharaters({ text: currentPriority.name, - numChars: 15, + numChars: 15 })} ) : ( - - {translate("settingScreen.priorityScreen.priorities")} + + {translate('settingScreen.priorityScreen.priorities')} )} - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, - fontSize: 10, + fontSize: 10 }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskPriority +export default TaskPriority; diff --git a/apps/mobile/app/components/TaskPriorityPopup.tsx b/apps/mobile/app/components/TaskPriorityPopup.tsx index 900fe1dc8..d492db6fd 100644 --- a/apps/mobile/app/components/TaskPriorityPopup.tsx +++ b/apps/mobile/app/components/TaskPriorityPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; -import { spacing, useAppTheme } from '../theme'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; import { BadgedTaskPriority } from './PriorityIcon'; import { useTaskPriority } from '../services/hooks/features/useTaskPriority'; import { ITaskPriorityItem } from '../services/interfaces/ITaskPriority'; import { translate } from '../i18n'; import { BlurView } from 'expo-blur'; +import TaskPriorityForm from '../screens/Authenticated/TaskPrioritiesScreen/components/TaskPriorityForm'; export interface Props { visible: boolean; onDismiss: () => unknown; priorityName: string; setSelectedPriority: (status: ITaskPriorityItem) => unknown; + canCreatePriority?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -74,10 +76,15 @@ const TaskPriorityPopup: FC = function TaskPriorityPopup({ visible, onDismiss, setSelectedPriority, - priorityName + priorityName, + canCreatePriority }) { const { allTaskPriorities } = useTaskPriority(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + const { createPriority, updatePriority } = useTaskPriority(); + + const [createPriorityMode, setCreatePriorityMode] = useState(false); + const onPrioritySelected = (size: ITaskPriorityItem) => { setSelectedPriority(size); onDismiss(); @@ -85,20 +92,61 @@ const TaskPriorityPopup: FC = function TaskPriorityPopup({ return ( - - - {translate('settingScreen.priorityScreen.priorities')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createPriorityMode ? ( + <> + + {translate('settingScreen.priorityScreen.priorities')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreatePriority && ( + setCreatePriorityMode(true)} + > + + + {translate('settingScreen.priorityScreen.createNewPriorityText')} + + + )} + + ) : ( + setCreatePriorityMode(false)} + onCreatePriority={createPriority} + onUpdatePriority={updatePriority} + isEdit={false} + /> + )} ); @@ -138,6 +186,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, @@ -154,6 +208,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, title: { fontSize: spacing.medium - 2, marginBottom: 16, diff --git a/apps/mobile/app/components/TaskSize.tsx b/apps/mobile/app/components/TaskSize.tsx index 4d5587902..0aad6c20e 100644 --- a/apps/mobile/app/components/TaskSize.tsx +++ b/apps/mobile/app/components/TaskSize.tsx @@ -1,60 +1,57 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { showMessage } from "react-native-flash-message" -import { typography, useAppTheme } from "../theme" -import TaskSizePopup from "./TaskSizePopup" -import { translate } from "../i18n" -import { limitTextCharaters } from "../helpers/sub-text" -import { useTaskSizeValue } from "./StatusType" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { showMessage } from 'react-native-flash-message'; +import { typography, useAppTheme } from '../theme'; +import TaskSizePopup from './TaskSizePopup'; +import { translate } from '../i18n'; +import { limitTextCharaters } from '../helpers/sub-text'; +import { useTaskSizeValue } from './StatusType'; interface TaskSizeProps { - task?: ITeamTask - containerStyle?: ViewStyle - statusTextSyle?: TextStyle - size?: string - setSize?: (size: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + statusTextSyle?: TextStyle; + size?: string; + setSize?: (size: string) => unknown; + canCreateSize?: boolean; } -const TaskSize: FC = observer(({ task, containerStyle, setSize, size }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) +const TaskSize: FC = observer(({ task, containerStyle, setSize, size, canCreateSize }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskSizes = useTaskSizeValue() + const allTaskSizes = useTaskSizeValue(); - const sizeValue = ( - task?.size?.split("-").join(" ") || - (size && size.split("-").join(" ")) - )?.toLowerCase() + const sizeValue = (task?.size?.split('-').join(' ') || (size && size.split('-').join(' ')))?.toLowerCase(); const currentSize = - allTaskSizes && - Object.values(allTaskSizes).find((item) => item.name.toLowerCase() === sizeValue) + allTaskSizes && Object.values(allTaskSizes).find((item) => item.name.toLowerCase() === sizeValue); const onChangeSize = async (text: string) => { if (task) { const taskEdit = { ...task, - size: task?.size === text ? null : text, - } + size: task?.size === text ? null : text + }; - const { response } = await updateTask(taskEdit, task.id) + const { response } = await updateTask(taskEdit, task.id); if (response.status !== 202) { showMessage({ - message: "Something went wrong", - type: "danger", - }) + message: 'Something went wrong', + type: 'danger' + }); } } else { - setSize(text) + setSize(text); } - } + }; return ( <> @@ -63,6 +60,7 @@ const TaskSize: FC = observer(({ task, containerStyle, setSize, s visible={openModal} setSelectedSize={(e) => onChangeSize(e.value)} onDismiss={() => setOpenModal(false)} + canCreateSize={canCreateSize} /> setOpenModal(true)}> = observer(({ task, containerStyle, setSize, s ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: currentSize?.bgColor, + backgroundColor: currentSize?.bgColor }} > {(task?.size || size) && currentSize ? ( @@ -84,42 +82,38 @@ const TaskSize: FC = observer(({ task, containerStyle, setSize, s - {translate("settingScreen.sizeScreen.sizes")} + {translate('settingScreen.sizeScreen.sizes')} )} - + - ) -}) + ); +}); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, - fontSize: 10, + fontSize: 10 }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskSize +export default TaskSize; diff --git a/apps/mobile/app/components/TaskSizePopup.tsx b/apps/mobile/app/components/TaskSizePopup.tsx index 9e5c83896..557256607 100644 --- a/apps/mobile/app/components/TaskSizePopup.tsx +++ b/apps/mobile/app/components/TaskSizePopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; -import { spacing, useAppTheme } from '../theme'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; import { useTaskSizes } from '../services/hooks/features/useTaskSizes'; import { ITaskSizeItem } from '../services/interfaces/ITaskSize'; import { BadgedTaskSize } from './SizeIcon'; import { translate } from '../i18n'; import { BlurView } from 'expo-blur'; +import TaskSizeForm from '../screens/Authenticated/TaskSizeScreen/components/TaskSizeForm'; export interface Props { visible: boolean; onDismiss: () => unknown; sizeName: string; setSelectedSize: (status: ITaskSizeItem) => unknown; + canCreateSize?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -70,9 +72,19 @@ const ModalPopUp = ({ visible, children, onDismiss }) => { ); }; -const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, setSelectedSize, sizeName }) { +const TaskStatusPopup: FC = function FilterPopup({ + visible, + onDismiss, + setSelectedSize, + sizeName, + canCreateSize +}) { const { allTaskSizes } = useTaskSizes(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + const { createSize, updateSize } = useTaskSizes(); + + const [createSizeMode, setCreateSizeMode] = useState(false); + const onStatusSelected = (size: ITaskSizeItem) => { setSelectedSize(size); onDismiss(); @@ -80,20 +92,57 @@ const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, se return ( - - - {translate('settingScreen.sizeScreen.sizes')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createSizeMode ? ( + <> + + {translate('settingScreen.sizeScreen.sizes')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreateSize && ( + setCreateSizeMode(true)} + > + + + {translate('settingScreen.sizeScreen.createNewSizeText')} + + + )} + + ) : ( + setCreateSizeMode(false)} + onCreateSize={createSize} + onUpdateSize={updateSize} + isEdit={false} + /> + )} ); @@ -133,6 +182,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, @@ -149,6 +204,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, title: { fontSize: spacing.medium - 2, marginBottom: 16, diff --git a/apps/mobile/app/components/TaskStatus.tsx b/apps/mobile/app/components/TaskStatus.tsx index e2d54a7aa..e42821c89 100644 --- a/apps/mobile/app/components/TaskStatus.tsx +++ b/apps/mobile/app/components/TaskStatus.tsx @@ -1,55 +1,55 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from "react-native" -import { AntDesign, Feather } from "@expo/vector-icons" -import { ITeamTask } from "../services/interfaces/ITask" -import { observer } from "mobx-react-lite" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import TaskStatusPopup from "./TaskStatusPopup" -import { typography, useAppTheme } from "../theme" -import { translate } from "../i18n" -import { useTaskStatusValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native'; +import { AntDesign, Feather } from '@expo/vector-icons'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { observer } from 'mobx-react-lite'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import TaskStatusPopup from './TaskStatusPopup'; +import { typography, useAppTheme } from '../theme'; +import { translate } from '../i18n'; +import { useTaskStatusValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; interface TaskStatusProps { - task?: ITeamTask - containerStyle?: ViewStyle - statusTextSyle?: TextStyle - iconsOnly?: boolean - labelOnly?: boolean - status?: string - setStatus?: (status: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + statusTextSyle?: TextStyle; + iconsOnly?: boolean; + labelOnly?: boolean; + status?: string; + setStatus?: (status: string) => unknown; + canCreateStatus?: boolean; } const TaskStatus: FC = observer( - ({ task, containerStyle, status, setStatus, iconsOnly, labelOnly }) => { - const { colors, dark } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, status, setStatus, iconsOnly, labelOnly, canCreateStatus }) => { + const { colors, dark } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allStatuses = useTaskStatusValue() + const allStatuses = useTaskStatusValue(); const statusValue = ( - task?.status?.split("-").join(" ") || - (status && status.split("-").join(" ")) - )?.toLowerCase() + task?.status?.split('-').join(' ') || + (status && status.split('-').join(' ')) + )?.toLowerCase(); const statusItem = - allStatuses && - Object.values(allStatuses).find((item) => item?.name.toLowerCase() === statusValue) + allStatuses && Object.values(allStatuses).find((item) => item?.name.toLowerCase() === statusValue); const onChangeStatus = async (text: string) => { if (task) { const taskEdit = { ...task, - status: task?.status === text ? null : text, - } + status: task?.status === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setStatus(text) + setStatus(text); } - } + }; return ( <> @@ -58,6 +58,7 @@ const TaskStatus: FC = observer( visible={openModal} setSelectedStatus={(e) => onChangeStatus(e)} onDismiss={() => setOpenModal(false)} + canCreateStatus={canCreateStatus} /> setOpenModal(true)}> = observer( ...styles.container, borderWidth: iconsOnly ? 0 : 1, ...containerStyle, - backgroundColor: !dark ? "#F2F2F2" : colors.background, - borderColor: colors.border, + backgroundColor: !dark ? '#F2F2F2' : colors.background, + borderColor: colors.border }, - statusItem ? { backgroundColor: statusItem?.bgColor } : null, + statusItem ? { backgroundColor: statusItem?.bgColor } : null ]} > {statusItem ? ( - + {!labelOnly && statusItem.icon} {iconsOnly ? null : ( = observer( style={{ ...styles.text, marginLeft: labelOnly ? 0 : 11, - fontSize: labelOnly ? 8 : 10, + fontSize: labelOnly ? 8 : 10 }} > {limitTextCharaters({ text: statusItem?.name, - numChars: 11, + numChars: 11 })} )} @@ -96,40 +97,40 @@ const TaskStatus: FC = observer( {iconsOnly ? ( ) : ( - translate("settingScreen.statusScreen.statuses") + translate('settingScreen.statusScreen.statuses') )} )} - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", + alignItems: 'center', borderRadius: 10, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 10, - textTransform: "capitalize", + textTransform: 'capitalize' }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - }, -}) + alignItems: 'center', + flexDirection: 'row' + } +}); -export default TaskStatus +export default TaskStatus; diff --git a/apps/mobile/app/components/TaskStatusPopup.tsx b/apps/mobile/app/components/TaskStatusPopup.tsx index 236277269..2caa183b9 100644 --- a/apps/mobile/app/components/TaskStatusPopup.tsx +++ b/apps/mobile/app/components/TaskStatusPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; import { useTaskStatus } from '../services/hooks/features/useTaskStatus'; import { ITaskStatusItem } from '../services/interfaces/ITaskStatus'; import { spacing, typography, useAppTheme } from '../theme'; import { translate } from '../i18n'; import { useTaskStatusValue } from './StatusType'; import { BlurView } from 'expo-blur'; +import TaskStatusForm from '../screens/Authenticated/TaskStatusScreen/components/TaskStatusForm'; export interface Props { visible: boolean; onDismiss: () => unknown; statusName: string; setSelectedStatus?: (status: string) => unknown; + canCreateStatus?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -70,9 +72,20 @@ const ModalPopUp = ({ visible, children, onDismiss }) => { ); }; -const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, setSelectedStatus, statusName }) { +const TaskStatusPopup: FC = function FilterPopup({ + visible, + onDismiss, + setSelectedStatus, + statusName, + canCreateStatus +}) { const { allStatuses } = useTaskStatus(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + + const [createStatusMode, setCreateStatusMode] = useState(false); + + const { createStatus, updateStatus } = useTaskStatus(); + const onStatusSelected = (status: string) => { setSelectedStatus(status); onDismiss(); @@ -80,20 +93,61 @@ const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, se return ( - - - {translate('settingScreen.statusScreen.statuses')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createStatusMode ? ( + <> + + {translate('settingScreen.statusScreen.statuses')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreateStatus && ( + setCreateStatusMode(true)} + > + + + {translate('settingScreen.statusScreen.createNewStatusText')} + + + )} + + ) : ( + setCreateStatusMode(false)} + onCreateStatus={createStatus} + onUpdateStatus={updateStatus} + isEdit={false} + /> + )} ); @@ -139,6 +193,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { alignItems: 'center', backgroundColor: '#D4EFDF', @@ -158,6 +218,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, text: { fontFamily: typography.primary.medium, fontSize: 14, diff --git a/apps/mobile/app/components/TaskVersion.tsx b/apps/mobile/app/components/TaskVersion.tsx index 1499727a0..dc1425534 100644 --- a/apps/mobile/app/components/TaskVersion.tsx +++ b/apps/mobile/app/components/TaskVersion.tsx @@ -1,50 +1,50 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { typography, useAppTheme } from "../theme" -import { translate } from "../i18n" -import { useTaskVersionValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" -import TaskVersionPopup from "./TaskVersionPopup" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { typography, useAppTheme } from '../theme'; +import { translate } from '../i18n'; +import { useTaskVersionValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; +import TaskVersionPopup from './TaskVersionPopup'; interface TaskVersionProps { - task?: ITeamTask - containerStyle?: ViewStyle - version?: string - setVersion?: (priority: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + version?: string; + setVersion?: (priority: string) => unknown; + canCreateVersion?: boolean; } const TaskVersion: FC = observer( - ({ task, containerStyle, version, setVersion }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, version, setVersion, canCreateVersion }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskVersions = useTaskVersionValue() + const allTaskVersions = useTaskVersionValue(); - const versionValue = (task?.version || (version && version))?.toLowerCase() + const versionValue = (task?.version || (version && version))?.toLowerCase(); const currentVersion = - allTaskVersions && - Object.values(allTaskVersions).find((item) => item.value.toLowerCase() === versionValue) + allTaskVersions && Object.values(allTaskVersions).find((item) => item.value.toLowerCase() === versionValue); const onChangeVersion = async (text: string) => { if (task) { const taskEdit = { ...task, - version: task?.version === text ? null : text, - } + version: task?.version === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setVersion(text) + setVersion(text); } - } + }; return ( <> @@ -53,6 +53,7 @@ const TaskVersion: FC = observer( visible={openModal} setSelectedVersion={(e) => onChangeVersion(e.value)} onDismiss={() => setOpenModal(false)} + canCreateVersion={canCreateVersion} /> setOpenModal(true)}> = observer( ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: colors.background, + backgroundColor: colors.background }} > {(task?.version || version) && currentVersion ? ( @@ -70,22 +71,20 @@ const TaskVersion: FC = observer( style={{ ...styles.text, marginLeft: 10, - color: colors.primary, + color: colors.primary }} > {limitTextCharaters({ text: currentVersion.name, - numChars: 15, + numChars: 15 })} ) : ( - - {translate("taskDetailsScreen.version")} + + {translate('taskDetailsScreen.version')} )} @@ -93,32 +92,32 @@ const TaskVersion: FC = observer( - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 10, - textTransform: "capitalize", + textTransform: 'capitalize' }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskVersion +export default TaskVersion; diff --git a/apps/mobile/app/components/TaskVersionPopup.tsx b/apps/mobile/app/components/TaskVersionPopup.tsx index 3de99d19d..3c9798e26 100644 --- a/apps/mobile/app/components/TaskVersionPopup.tsx +++ b/apps/mobile/app/components/TaskVersionPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from "react" +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -10,22 +10,25 @@ import { Text, FlatList, TouchableOpacity, - TouchableWithoutFeedback, -} from "react-native" -import { Feather, AntDesign } from "@expo/vector-icons" -import { spacing, useAppTheme } from "../theme" -import { ITaskPriorityItem } from "../services/interfaces/ITaskPriority" + TouchableWithoutFeedback +} from 'react-native'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; +import { ITaskPriorityItem } from '../services/interfaces/ITaskPriority'; // import { translate } from "../i18n" -import { BlurView } from "expo-blur" -import { useTaskVersion } from "../services/hooks/features/useTaskVersion" -import { BadgedTaskVersion } from "./VersionIcon" -import { ITaskVersionItemList } from "../services/interfaces/ITaskVersion" +import { BlurView } from 'expo-blur'; +import { useTaskVersion } from '../services/hooks/features/useTaskVersion'; +import { BadgedTaskVersion } from './VersionIcon'; +import { ITaskVersionItemList } from '../services/interfaces/ITaskVersion'; +import { translate } from '../i18n'; +import TaskVersionForm from '../screens/Authenticated/TaskVersionScreen/components/TaskVersionForm'; export interface Props { - visible: boolean - onDismiss: () => unknown - versionName: string - setSelectedVersion: (status: ITaskVersionItemList) => unknown + visible: boolean; + onDismiss: () => unknown; + versionName: string; + setSelectedVersion: (status: ITaskVersionItemList) => unknown; + canCreateVersion?: boolean; } const TaskVersionPopup: FC = function TaskPriorityPopup({ @@ -33,52 +36,96 @@ const TaskVersionPopup: FC = function TaskPriorityPopup({ onDismiss, setSelectedVersion, versionName, + canCreateVersion }) { - const { taskVersionList } = useTaskVersion() - const { colors } = useAppTheme() + const { taskVersionList } = useTaskVersion(); + const { colors, dark } = useAppTheme(); + const { createTaskVersion, updateTaskVersion } = useTaskVersion(); + + const [createVersionMode, setCreateVersionMode] = useState(false); + const onVersionSelected = (size: ITaskPriorityItem) => { - setSelectedVersion(size) - onDismiss() - } + setSelectedVersion(size); + onDismiss(); + setCreateVersionMode(false); + }; return ( - - Versions - ( - + {!createVersionMode ? ( + <> + Versions + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} /> - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + {canCreateVersion && ( + setCreateVersionMode(true)} + > + + + {translate('settingScreen.versionScreen.createNewVersionText')} + + + )} + + ) : ( + setCreateVersionMode(false)} + onCreateVersion={createTaskVersion} + onUpdateVersion={updateTaskVersion} + isEdit={false} + createVersionModal={true} + /> + )} - ) -} + ); +}; -export default TaskVersionPopup +export default TaskVersionPopup; interface ItemProps { - currentVersionName: string - version: ITaskPriorityItem - onVersionSelected: (size: ITaskPriorityItem) => unknown + currentVersionName: string; + version: ITaskPriorityItem; + onVersionSelected: (size: ITaskPriorityItem) => unknown; } const Item: FC = ({ currentVersionName, version, onVersionSelected }) => { - const { colors } = useAppTheme() - const selected = version.value === currentVersionName + const { colors } = useAppTheme(); + const selected = version.value === currentVersionName; return ( onVersionSelected(version)}> - + @@ -90,91 +137,107 @@ const Item: FC = ({ currentVersionName, version, onVersionSelected }) - ) -} + ); +}; const ModalPopUp = ({ visible, children, onDismiss }) => { - const [showModal, setShowModal] = React.useState(visible) - const scaleValue = React.useRef(new Animated.Value(0)).current + const [showModal, setShowModal] = React.useState(visible); + const scaleValue = React.useRef(new Animated.Value(0)).current; React.useEffect(() => { - toggleModal() - }, [visible]) + toggleModal(); + }, [visible]); const toggleModal = () => { if (visible) { - setShowModal(true) + setShowModal(true); Animated.spring(scaleValue, { toValue: 1, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } else { - setTimeout(() => setShowModal(false), 200) + setTimeout(() => setShowModal(false), 200); Animated.timing(scaleValue, { toValue: 0, duration: 300, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } - } + }; return ( onDismiss()}> - - {children} - + {children} - ) -} + ); +}; const $modalBackGround: ViewStyle = { flex: 1, - justifyContent: "center", -} + justifyContent: 'center' +}; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, - justifyContent: "center", + justifyContent: 'center', paddingLeft: 16, - width: 180, + width: 180 }, container: { - alignSelf: "center", - backgroundColor: "#fff", + alignSelf: 'center', + backgroundColor: '#fff', borderRadius: 20, maxHeight: 396, paddingHorizontal: 6, paddingVertical: 16, - width: "90%", + width: '90%' + }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' }, title: { fontSize: spacing.medium - 2, marginBottom: 16, - marginHorizontal: 10, + marginHorizontal: 10 }, wrapperItem: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.13)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.13)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', marginBottom: 10, padding: 6, paddingRight: 18, - width: "100%", - }, -}) + width: '100%' + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx index b3fa3cf6c..591b4080f 100644 --- a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx @@ -1,14 +1,11 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { useEffect, useState } from "react" -import { View, Text, TouchableOpacity, TextInput, StyleSheet, Keyboard } from "react-native" -import { translate } from "../../../../i18n" -import { typography, useAppTheme } from "../../../../theme" +import React, { useEffect, useState } from 'react'; +import { View, Text, TouchableOpacity, TextInput, StyleSheet, Keyboard } from 'react-native'; +import { translate } from '../../../../i18n'; +import { typography, useAppTheme } from '../../../../theme'; -import { - ITaskVersionCreate, - ITaskVersionItemList, -} from "../../../../services/interfaces/ITaskVersion" +import { ITaskVersionCreate, ITaskVersionItemList } from '../../../../services/interfaces/ITaskVersion'; const TaskVersionForm = ({ isEdit, @@ -16,43 +13,45 @@ const TaskVersionForm = ({ item, onCreateVersion, onUpdateVersion, + createVersionModal }: { - isEdit: boolean - onDismiss: () => unknown - item?: ITaskVersionItemList - onUpdateVersion: (id: string, data: ITaskVersionCreate) => unknown - onCreateVersion: (data: ITaskVersionCreate) => unknown + isEdit: boolean; + onDismiss: () => unknown; + item?: ITaskVersionItemList; + onUpdateVersion: (id: string, data: ITaskVersionCreate) => unknown; + onCreateVersion: (data: ITaskVersionCreate) => unknown; + createVersionModal?: boolean; }) => { - const { colors, dark } = useAppTheme() - const [versionName, setVersionName] = useState(null) + const { colors, dark } = useAppTheme(); + const [versionName, setVersionName] = useState(null); useEffect(() => { if (isEdit) { - setVersionName(item.name) + setVersionName(item.name); } else { - setVersionName(null) + setVersionName(null); } - }, [item, isEdit]) + }, [item, isEdit]); const handleSubmit = async () => { if (versionName.trim().length <= 0) { - return + return; } if (isEdit) { await onUpdateVersion(item?.id, { - name: versionName, - }) + name: versionName + }); } else { await onCreateVersion({ name: versionName, - color: "#FFFFFF", - }) + color: '#FFFFFF' + }); } - setVersionName(null) - onDismiss() - } + setVersionName(null); + onDismiss(); + }; return ( - {translate("settingScreen.versionScreen.createNewVersionText")} + {translate('settingScreen.versionScreen.createNewVersionText')} setVersionName(text)} /> - + { - onDismiss() - Keyboard.dismiss() + onDismiss(); + Keyboard.dismiss(); }} > - - {translate("settingScreen.versionScreen.cancelButtonText")} - + {translate('settingScreen.versionScreen.cancelButtonText')} { if (versionName) { - handleSubmit().finally(() => Keyboard.dismiss()) + handleSubmit().finally(() => Keyboard.dismiss()); } }} > {isEdit - ? translate("settingScreen.versionScreen.updateButtonText") - : translate("settingScreen.versionScreen.createButtonText")} + ? translate('settingScreen.versionScreen.updateButtonText') + : translate('settingScreen.versionScreen.createButtonText')} - ) -} + ); +}; -export default TaskVersionForm +export default TaskVersionForm; const styles = StyleSheet.create({ cancelBtn: { - alignItems: "center", - backgroundColor: "#E6E6E9", + alignItems: 'center', + backgroundColor: '#E6E6E9', borderRadius: 12, height: 57, - justifyContent: "center", - width: "48%", + justifyContent: 'center', + width: '48%' }, cancelTxt: { - color: "#1A1C1E", + color: '#1A1C1E', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, createBtn: { - alignItems: "center", - backgroundColor: "#3826A6", + alignItems: 'center', + backgroundColor: '#3826A6', borderRadius: 12, height: 57, - justifyContent: "center", - width: "48%", + justifyContent: 'center', + width: '48%' }, createTxt: { - color: "#FFF", + color: '#FFF', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, formTitle: { - color: "#1A1C1E", + color: '#1A1C1E', fontFamily: typography.primary.semiBold, - fontSize: 24, + fontSize: 24 }, versionNameInput: { - alignItems: "center", - borderColor: "#DCE4E8", + alignItems: 'center', + borderColor: '#DCE4E8', borderRadius: 12, borderWidth: 1, height: 57, marginTop: 16, paddingHorizontal: 18, - width: "100%", + width: '100%' }, wrapButtons: { - flexDirection: "row", - justifyContent: "space-between", - marginTop: 40, - width: "100%", - }, -}) + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%' + } +}); diff --git a/apps/mobile/app/services/client/requests/features/smtp.ts b/apps/mobile/app/services/client/requests/features/smtp.ts index 4442f4fd3..21c7e9ace 100644 --- a/apps/mobile/app/services/client/requests/features/smtp.ts +++ b/apps/mobile/app/services/client/requests/features/smtp.ts @@ -7,7 +7,7 @@ export const smtpConfiguration: () => I_SMTPRequest = () => ({ fromAddress: SMTP_FROM_ADDRESS || '', host: SMTP_HOST || '', port: parseInt(SMTP_PORT, 10) || 0, - secure: SMTP_SECURE === 'true' ? true : false, + secure: SMTP_SECURE === 'true', username: SMTP_USERNAME || '', password: SMTP_PASSWORD || '' }); diff --git a/apps/web/.env b/apps/web/.env index 409ebce1b..539845cf2 100644 --- a/apps/web/.env +++ b/apps/web/.env @@ -34,7 +34,7 @@ APP_LOGO_URL="https://app.ever.team/assets/ever-teams.png" NEXT_PUBLIC_COOKIE_DOMAINS=ever.team # Board -NEXT_PUBLIC_BOARD_APP_DOMAIN=https://board.ever.team +NEXT_PUBLIC_BOARD_APP_DOMAIN="https://board.ever.team" NEXT_PUBLIC_BOARD_BACKEND_POST_URL="https://jsonboard.ever.team/api/v2/post/" NEXT_PUBLIC_BOARD_FIREBASE_CONFIG= diff --git a/apps/web/app/constants.ts b/apps/web/app/constants.ts index f36e052a6..39ccdb801 100644 --- a/apps/web/app/constants.ts +++ b/apps/web/app/constants.ts @@ -32,9 +32,10 @@ export const RECAPTCHA_SITE_KEY = process.env.NEXT_PUBLIC_CAPTCHA_SITE_KEY; export const RECAPTCHA_SECRET_KEY = process.env.CAPTCHA_SECRET_KEY; export const GAUZY_API_SERVER_URL = process.env.GAUZY_API_SERVER_URL || 'https://api.gauzy.co/api'; -export const INVITE_CALLBACK_URL = process.env.INVITE_CALLBACK_URL; + +export const INVITE_CALLBACK_URL = process.env.INVITE_CALLBACK_URL || 'https://app.ever.team/auth/passcode'; export const INVITE_CALLBACK_PATH = '/auth/passcode'; -export const VERIFY_EMAIL_CALLBACK_URL = process.env.VERIFY_EMAIL_CALLBACK_URL; +export const VERIFY_EMAIL_CALLBACK_URL = process.env.VERIFY_EMAIL_CALLBACK_URL || 'https://app.ever.team/verify-email'; export const VERIFY_EMAIL_CALLBACK_PATH = '/verify-email'; export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID; @@ -73,7 +74,7 @@ export const MEET_JWT_TOKEN_COOKIE_NAME = 'meet-jwt-session'; // BOARD board export const BOARD_APP_DOMAIN = process.env.NEXT_PUBLIC_BOARD_APP_DOMAIN || 'https://board.ever.team'; -export const BOARD_BACKEND_POST_URL = process.env.NEXT_PUBLIC_BOARD_BACKEND_POST_URL; +export const BOARD_BACKEND_POST_URL = process.env.NEXT_PUBLIC_BOARD_BACKEND_POST_URL || 'https://jsonboard.ever.team/api/v2/post/'; export const BOARD_FIREBASE_CONFIG = process.env.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG; // Jitsu diff --git a/apps/web/app/helpers/validations.ts b/apps/web/app/helpers/validations.ts index 045ef0156..6971ef3f1 100644 --- a/apps/web/app/helpers/validations.ts +++ b/apps/web/app/helpers/validations.ts @@ -23,10 +23,9 @@ export const authFormValidate = (keys: (keyof IRegisterDataAPI)[], values: IRegi } break; case 'recaptcha': - if(RECAPTCHA_SITE_KEY) { + if (RECAPTCHA_SITE_KEY) { if (!values['recaptcha'] || values['recaptcha'].trim().length < 2) { - err['recaptcha'] = - 'Please check the ReCaptcha checkbox before continue'; + err['recaptcha'] = 'Please check the ReCaptcha checkbox before continue'; } } break; @@ -90,6 +89,8 @@ export function validateForm(keys: (keyof T)[], data: T) { export function validSMTPConfig() { const SMTPConfig = smtpConfiguration(); + console.log(`SMTP Config: ${JSON.stringify(SMTPConfig)}`); + const keys = Object.keys(SMTPConfig) as (keyof I_SMTPRequest)[]; if (keys.some((key) => SMTPConfig[key] === null || SMTPConfig[key] === undefined)) { diff --git a/apps/web/app/hooks/features/useKanban.ts b/apps/web/app/hooks/features/useKanban.ts new file mode 100644 index 000000000..94b0c653c --- /dev/null +++ b/apps/web/app/hooks/features/useKanban.ts @@ -0,0 +1,37 @@ +import { kanbanBoardState } from "@app/stores/kanban"; +import { useTaskStatus } from "./useTaskStatus"; +import { useRecoilState } from "recoil"; +import { useEffect, useState } from "react"; +import { ITaskStatusItemList } from "@app/interfaces"; + +export function useKanban() { + + const [loading, setLoading] = useState(true); + + const [kanbanBoard, setKanbanBoard] = useRecoilState(kanbanBoardState); + + const taskStatusHook = useTaskStatus(); + + /** + * format data for kanban board + */ + useEffect(()=> { + if(taskStatusHook.loading) { + let kanban = {}; + taskStatusHook.taskStatus.map((taskStatus: ITaskStatusItemList,)=> { + kanban = { + ...kanban, + [taskStatus.name ? taskStatus.name : ''] : [] + } + }); + setKanbanBoard(kanban) + setLoading(false) + } + },[taskStatusHook.loading]) + + return { + data: kanbanBoard, + isLoading: loading, + columns: taskStatusHook.taskStatus + } +} \ No newline at end of file diff --git a/apps/web/app/hooks/features/useTeamInvitations.ts b/apps/web/app/hooks/features/useTeamInvitations.ts index 5e1118437..6559b6159 100644 --- a/apps/web/app/hooks/features/useTeamInvitations.ts +++ b/apps/web/app/hooks/features/useTeamInvitations.ts @@ -21,8 +21,6 @@ import { useQuery } from '../useQuery'; import { useAuthenticateUser } from './useAuthenticateUser'; export function useTeamInvitations() { - const { user } = useAuthenticateUser(); - const setTeamInvitations = useSetRecoilState(teamInvitationsState); const [myInvitationsList, setMyInvitationsList] = useRecoilState(myInvitationsState); @@ -48,14 +46,24 @@ export function useTeamInvitations() { const { queryCall: acceptRejectMyInvitationsQueryCall, loading: acceptRejectMyInvitationsLoading } = useQuery(acceptRejectMyInvitationsAPI); + const { user } = useAuthenticateUser(); + const inviteUser = useCallback( (email: string, name: string) => { - return inviteQueryCall({ email, name }).then((res) => { - setTeamInvitations(res.data?.items || []); + return inviteQueryCall( + { + email, + name, + organizationId: user?.employee.organizationId as string, + teamId: activeTeamId as string + }, + user?.tenantId as string + ).then((res) => { + setTeamInvitations((prev) => [...prev, ...(res.data?.items || [])]); return res; }); }, - [inviteQueryCall, setTeamInvitations] + [inviteQueryCall, setTeamInvitations, user?.tenantId, activeTeamId, user?.employee.organizationId] ); useEffect(() => { diff --git a/apps/web/app/hooks/features/useTeamTasks.ts b/apps/web/app/hooks/features/useTeamTasks.ts index 595a45e2f..140b1f0df 100644 --- a/apps/web/app/hooks/features/useTeamTasks.ts +++ b/apps/web/app/hooks/features/useTeamTasks.ts @@ -112,7 +112,7 @@ export function useTeamTasks() { }); } - if (!user || activeTeamRef.current?.id) { + if (!user || !activeTeamRef.current?.id) { return new Promise((response) => { response(true); }); diff --git a/apps/web/app/interfaces/IKanban.ts b/apps/web/app/interfaces/IKanban.ts new file mode 100644 index 000000000..2d17b3da5 --- /dev/null +++ b/apps/web/app/interfaces/IKanban.ts @@ -0,0 +1,5 @@ +import { ITeamTask } from "./ITask"; + +export interface IKanban { + [key: string]: ITeamTask[] +} \ No newline at end of file diff --git a/apps/web/app/services/client/api/invite.ts b/apps/web/app/services/client/api/invite.ts index 63e9ceb7c..73e46035c 100644 --- a/apps/web/app/services/client/api/invite.ts +++ b/apps/web/app/services/client/api/invite.ts @@ -1,9 +1,47 @@ import { PaginationResponse } from '@app/interfaces/IDataResponse'; -import { IInvitation, IInviteRequest, MyInvitationActionEnum, CreateResponse } from '@app/interfaces'; -import api, { get } from '../axios'; +import { IInvitation, MyInvitationActionEnum, CreateResponse, IInviteCreate, IRole } from '@app/interfaces'; +import { INVITE_CALLBACK_URL } from '@app/constants'; +import api, { get, post } from '../axios'; +import { AxiosResponse } from 'axios'; -export function inviteByEmailsAPI(data: IInviteRequest) { - return api.post>('/invite/emails', data); +interface IIInviteRequest { + email: string; + name: string; + teamId: string; + organizationId: string; +} + +export async function inviteByEmailsAPI(data: IIInviteRequest, tenantId: string) { + const endpoint = '/invite/emails'; + + const date = new Date(); + date.setDate(date.getDate() - 1); + + const getRoleEndpoint = '/roles/options?name=EMPLOYEE'; + + const employeeRole: AxiosResponse = (await get(getRoleEndpoint, true, { tenantId })).data; + + const dataToInviteUser: IInviteCreate & { tenantId: string } = { + emailIds: [data.email], + projectIds: [], + departmentIds: [], + organizationContactIds: [], + teamIds: [data.teamId], + roleId: employeeRole.data.id || '', + invitationExpirationPeriod: 'Never', + inviteType: 'TEAM', + appliedDate: null, + fullName: data.name, + callbackUrl: INVITE_CALLBACK_URL, + organizationId: data.organizationId, + tenantId, + startedWorkOn: date.toISOString() + }; + + // for not direct call we need to adjust data to include name and email only + const fetchData = await post(endpoint, dataToInviteUser, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? fetchData.data : fetchData; } export async function getTeamInvitationsAPI(tenantId: string, organizationId: string, role: string, teamId: string) { diff --git a/apps/web/app/services/client/axios.ts b/apps/web/app/services/client/axios.ts index 92f3452d2..bd53becb2 100644 --- a/apps/web/app/services/client/axios.ts +++ b/apps/web/app/services/client/axios.ts @@ -87,6 +87,23 @@ function get( : api.get(endpoint); } +function post( + endpoint: string, + data: any, + isDirect: boolean, + extras?: { + tenantId: string; + } +) { + return isDirect && process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL + ? apiDirect.post(endpoint, data, { + headers: { + ...(extras?.tenantId ? { 'tenant-id': extras?.tenantId } : {}) + } + }) + : api.post(endpoint, data); +} + export default api; -export { apiDirect, get }; +export { apiDirect, get, post }; diff --git a/apps/web/app/services/server/requests/smtp.ts b/apps/web/app/services/server/requests/smtp.ts index 79e9a5b05..d0e1cd695 100644 --- a/apps/web/app/services/server/requests/smtp.ts +++ b/apps/web/app/services/server/requests/smtp.ts @@ -4,6 +4,9 @@ import { serverFetch } from '../fetch'; export function createTenantSmtpRequest({ tenantId, access_token }: { tenantId: string; access_token: string }) { const config = smtpConfiguration(); + + console.log(`SMTP Config: ${JSON.stringify(config)}`); + return serverFetch({ path: '/smtp', method: 'POST', diff --git a/apps/web/app/stores/kanban.ts b/apps/web/app/stores/kanban.ts new file mode 100644 index 000000000..0badd4c91 --- /dev/null +++ b/apps/web/app/stores/kanban.ts @@ -0,0 +1,7 @@ +import { IKanban } from "@app/interfaces/IKanban"; +import { atom } from "recoil"; + +export const kanbanBoardState = atom({ + key: 'kanbanBoardState', + default: {} +}) \ No newline at end of file diff --git a/apps/web/app/stores/task-filter.ts b/apps/web/app/stores/task-filter.ts new file mode 100644 index 000000000..35a4a2afb --- /dev/null +++ b/apps/web/app/stores/task-filter.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const taskBlockFilterState = atom<'all' | 'running' | 'online' | 'pause' | 'idle' | 'suspended'>({ + key: 'taskBlockFilterState', + default: 'all' +}); diff --git a/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx b/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx index cc08ecc02..bc86add07 100644 --- a/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx +++ b/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ import { calculateRemainingDays, formatDateString } from '@app/helpers'; import { useOrganizationTeams, useSyncRef, useTeamMemberCard, useTeamTasks } from '@app/hooks'; import { ITeamTask, OT_Member } from '@app/interfaces'; @@ -217,7 +218,10 @@ const ManageMembersPopover = (memberList: OT_Member[], task: ITeamTask | null) = const unassignedMembers = useMemo( () => memberList.filter((member) => - member.employee ? !task?.members.map((item) => item.userId).includes(member.employee.userId) : false + member.employee + ? !task?.members.map((item) => item.userId).includes(member.employee.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); @@ -225,7 +229,10 @@ const ManageMembersPopover = (memberList: OT_Member[], task: ITeamTask | null) = const assignedTaskMembers = useMemo( () => memberList.filter((member) => - member.employee ? task?.members.map((item) => item.userId).includes(member.employee?.userId) : false + member.employee + ? task?.members.map((item) => item.userId).includes(member.employee?.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); diff --git a/apps/web/lib/components/Kanban.tsx b/apps/web/lib/components/Kanban.tsx index b6b0a42d9..37d11a5d7 100644 --- a/apps/web/lib/components/Kanban.tsx +++ b/apps/web/lib/components/Kanban.tsx @@ -206,7 +206,7 @@ export const EmptyKanbanDroppable = ({index,title, items}: { { title.length > 0 ? <>
@@ -220,24 +220,28 @@ export const EmptyKanbanDroppable = ({index,title, items}: {
-
- {items.length} -
-
-

- {title} -

+
+
+ {items.length} +
+
+

+ + {title} + +

+
diff --git a/apps/web/lib/components/radial-progress.tsx b/apps/web/lib/components/radial-progress.tsx new file mode 100644 index 000000000..f15d10d24 --- /dev/null +++ b/apps/web/lib/components/radial-progress.tsx @@ -0,0 +1,52 @@ +export default function RadialProgress({ + radius = 24, + cx = 24, + cy = 24, + percentage = 55 +}: { + radius?: number; + cx?: number; + cy?: number; + percentage: number; +}) { + const circumference = radius * 2 * Math.PI; + + return ( + <> +
+ + + + + + {percentage}% + +
+ + ); +} diff --git a/apps/web/lib/components/separator.tsx b/apps/web/lib/components/separator.tsx index 394bb8e12..fb26b2f0c 100644 --- a/apps/web/lib/components/separator.tsx +++ b/apps/web/lib/components/separator.tsx @@ -4,3 +4,11 @@ import { clsxm } from '@app/utils'; export const VerticalSeparator = ({ className }: IClassName) => { return
; }; + +export const HorizontalSeparator = ({ className }: IClassName) => { + return ( +
+
+
+ ); +}; diff --git a/apps/web/lib/components/svgs/icons.tsx b/apps/web/lib/components/svgs/icons.tsx index 83e8afe54..d2b2b186b 100644 --- a/apps/web/lib/components/svgs/icons.tsx +++ b/apps/web/lib/components/svgs/icons.tsx @@ -1305,6 +1305,46 @@ export function StopCircleIcon({ className }: IClassName) { ); } +export function NotWorkingIcon({ className }: IClassName) { + return ( + + ); +} + +export function OnlineIcon({ className }: IClassName) { + return ( + + ); +} + // ============================= Settings 4 Icon ============================= // export function Settings4Icon({ className }: IClassName) { @@ -2221,13 +2261,13 @@ export function QuoteBlockIcon({ className }: IClassName) { ); } -export function AddIcon({ +export function AddIcon({ className, - width=14, - height=14 + width = 14, + height = 14 }: IClassName<{ - width?: number, - height?: number, + width?: number; + height?: number; }>) { return ( ; showStatus?: boolean }) { +export function TaskAllStatusTypes({ + task, + showStatus = false, + toBlockCard = false +}: { + task?: Nullable; + showStatus?: boolean; + toBlockCard?: boolean; +}) { const taskPriorities = useTaskPrioritiesValue(); const taskSizes = useTaskSizesValue(); const taskLabels = useTaskLabelsValue(); @@ -64,7 +72,7 @@ export function TaskAllStatusTypes({ task, showStatus = false }: { task?: Nullab /> )} - {task?.size && ( + {task?.size && !toBlockCard && ( 60) || false}> @@ -30,6 +56,7 @@ export function TaskNameInfoDisplay({ task, className, taskTitleClassName, taskN #{task?.taskNumber} {dash && '-'} {task?.title} + {showSize && {size && ' ' + short}} diff --git a/apps/web/lib/features/task/task-filters.tsx b/apps/web/lib/features/task/task-filters.tsx index d5430d436..fdaff4a8d 100644 --- a/apps/web/lib/features/task/task-filters.tsx +++ b/apps/web/lib/features/task/task-filters.tsx @@ -396,14 +396,16 @@ function TaskStatusFilter({ hook }: { hook: I_TaskFilter }) { ); } -function TaskNameFilter({ +export function TaskNameFilter({ value, setValue, - close + close, + fullWidth = false }: { value: string; setValue: (v: string) => void; close: () => void; + fullWidth?: boolean; }) { const { t } = useTranslation(); @@ -426,7 +428,7 @@ function TaskNameFilter({ }; return ( -
+
; + return radial ? ( + + ) : ( + + ); } diff --git a/apps/web/lib/features/task/task-times.tsx b/apps/web/lib/features/task/task-times.tsx index f5784fd6e..e3382025f 100644 --- a/apps/web/lib/features/task/task-times.tsx +++ b/apps/web/lib/features/task/task-times.tsx @@ -12,9 +12,10 @@ type Props = { memberInfo?: I_TeamMemberCardHook | OT_Member | any; showDaily?: boolean; showTotal?: boolean; + isBlock?: boolean; } & IClassName; -export function TaskTimes({ className, task, memberInfo, showDaily = true, showTotal = true }: Props) { +export function TaskTimes({ className, task, memberInfo, showDaily = true, showTotal = true, isBlock = false }: Props) { // For public page const { activeTeam } = useOrganizationTeams(); const currentMember = activeTeam?.members.find((member) => member.id === memberInfo?.member?.id || memberInfo?.id); @@ -38,7 +39,11 @@ export function TaskTimes({ className, task, memberInfo, showDaily = true, showT return (
- + {isBlock ? ( + + ) : ( + + )}
); } @@ -59,7 +64,7 @@ function TimeInfo({ <> {showDaily && (
- {t('common.TODAY')}: + {t('common.TODAY')}: {daily.h}h : {daily.m}m @@ -73,7 +78,7 @@ function TimeInfo({ // showDaily && ['text-sm'] )} > - {t('common.TOTAL')}: + {t('common.TOTAL')}: {total.h}h : {total.m}m @@ -83,6 +88,50 @@ function TimeInfo({ ); } +function TimeBlockInfo({ + daily, + total, + showDaily = true, + showTotal = true +}: { + daily: { h: number; m: number }; + total: { h: number; m: number }; + showDaily?: boolean; + showTotal?: boolean; +}) { + const { t } = useTranslation(); + return ( +
+ {showDaily && ( +
+ + {t('common.WORKED_ON_TASK')} {t('common.TODAY')}: + + + {daily.h}h : {daily.m}m + +
+ )} + + {showTotal && ( +
+ + {t('common.WORKED_ON_TASK')} {t('common.TOTAL')}: + + + {total.h}h : {total.m}m + +
+ )} +
+ ); +} + export function TodayWorkedTime({ className, memberInfo }: Omit) { // Get current timer seconds const { activeTeam } = useOrganizationTeams(); diff --git a/apps/web/lib/features/team-members-block-view.tsx b/apps/web/lib/features/team-members-block-view.tsx new file mode 100644 index 000000000..4ca828133 --- /dev/null +++ b/apps/web/lib/features/team-members-block-view.tsx @@ -0,0 +1,72 @@ +import * as React from 'react'; +import { OT_Member } from '@app/interfaces'; +import { Transition } from '@headlessui/react'; +import { UserTeamBlock } from './team/user-team-block'; +import UserTeamCardSkeletonCard from '@components/shared/skeleton/UserTeamCardSkeleton'; + +interface Props { + teamMembers: OT_Member[]; + publicTeam: boolean; + currentUser: OT_Member | undefined; + teamsFetching: boolean; +} + +const TeamMembersBlockView: React.FC = ({ teamMembers: members, publicTeam = false, currentUser }) => { + return ( +
+ {/* Current authenticated user members */} + + {/* */} + +
+ {members.map((member) => { + return ( +
+ + + +
+ ); + })} +
+
+ + {new Array(3).fill(0).map((_, i) => { + return ( +
+ +
+ ); + })} +
+
+
+ ); +}; + +export default TeamMembersBlockView; diff --git a/apps/web/lib/features/team-members-kanban-view.tsx b/apps/web/lib/features/team-members-kanban-view.tsx index cad9ba0b9..9b116c7c3 100644 --- a/apps/web/lib/features/team-members-kanban-view.tsx +++ b/apps/web/lib/features/team-members-kanban-view.tsx @@ -1,7 +1,7 @@ +import { useKanban } from "@app/hooks/features/useKanban"; import { clsxm } from "@app/utils"; import KanbanDraggable, { EmptyKanbanDroppable } from "lib/components/Kanban" import { AddIcon } from "lib/components/svgs"; -import { state } from "pages/kanban"; import React from "react"; import { useEffect, useState } from "react"; import { DragDropContext, DropResult, Droppable, DroppableProvided, DroppableStateSnapshot } from "react-beautiful-dnd"; @@ -53,19 +53,22 @@ const reorderItemMap = ({ itemMap, source, destination }: { }; }; -const getHeaderBackground = (column: any) => { - const selectState = state.filter((item: any)=> { +const getHeaderBackground = (columns: any, column: any) => { + const selectState = columns.filter((item: any)=> { return item.name === column.toUpperCase() }); - return selectState[0].backgroundColor + return selectState[0].color } export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { - const [items, setItems] = useState(itemsArray); + const { columns:kanbanColumns } = useKanban(); + const [items, setItems] = useState(itemsArray); + const [columns, setColumn] = useState(Object.keys(itemsArray)); + /** * This function handles all drag and drop logic * on the kanban board. @@ -156,7 +159,7 @@ export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { > {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => (
@@ -172,7 +175,7 @@ export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { index={index} title={column} items={items[column]} - backgroundColor={getHeaderBackground(column)} + backgroundColor={getHeaderBackground(kanbanColumns, column)} />
diff --git a/apps/web/lib/features/team-members-table-view.tsx b/apps/web/lib/features/team-members-table-view.tsx index 2d5e939bf..601e774a2 100644 --- a/apps/web/lib/features/team-members-table-view.tsx +++ b/apps/web/lib/features/team-members-table-view.tsx @@ -55,8 +55,6 @@ const TeamMembersTableView = ({ [] ); - const footerRows = React.useMemo(() => [], []); - const sortedTeamMembers: OT_Member[] = []; if (currentUser) { sortedTeamMembers.push(currentUser); @@ -64,15 +62,17 @@ const TeamMembersTableView = ({ sortedTeamMembers.push(...teamMembers); return ( - []} - data={sortedTeamMembers} - footerRows={footerRows} - noResultsMessage={{ - heading: 'No team members found', - content: 'Try adjusting your search or filter to find what you’re looking for.' - }} - /> + <> + []} + data={sortedTeamMembers} + noResultsMessage={{ + heading: 'No team members found', + content: 'Try adjusting your search or filter to find what you’re looking for.' + }} + /> + + ); }; @@ -81,10 +81,10 @@ function Invite() { const { openModal, isOpen, closeModal } = useModal(); return ( - <> +
- +
); } diff --git a/apps/web/lib/features/team-members.tsx b/apps/web/lib/features/team-members.tsx index 0370171ee..b5212fed2 100644 --- a/apps/web/lib/features/team-members.tsx +++ b/apps/web/lib/features/team-members.tsx @@ -6,17 +6,25 @@ import { UserCard } from '@components/shared/skeleton/TeamPageSkeleton'; import TeamMembersTableView from './team-members-table-view'; import TeamMembersCardView from './team-members-card-view'; import { IssuesView } from '@app/constants'; +import TeamMembersBlockView from './team-members-block-view'; +import { useRecoilValue } from 'recoil'; +import { taskBlockFilterState } from '@app/stores/task-filter'; type TeamMembersProps = { publicTeam?: boolean; kanbanView?: IssuesView; }; -export function TeamMembers({ publicTeam = false, kanbanView: kanbanView = IssuesView.CARDS }: TeamMembersProps) { +export function TeamMembers({ publicTeam = false, kanbanView: view = IssuesView.CARDS }: TeamMembersProps) { const { user } = useAuthenticateUser(); + const activeFilter = useRecoilValue(taskBlockFilterState); const { activeTeam } = useOrganizationTeams(); const { teamsFetching } = useOrganizationTeams(); const members = activeTeam?.members || []; + + const blockViewMembers = + activeFilter == 'all' ? members : members.filter((m) => m.timerStatus == activeFilter) || []; + const currentUser = members.find((m) => m.employee.userId === user?.id); const $members = members.filter((member) => member.id !== currentUser?.id); const $teamsFetching = teamsFetching && members.length === 0; @@ -34,11 +42,12 @@ export function TeamMembers({ publicTeam = false, kanbanView: kanbanView = Issue
+
); break; - case kanbanView === IssuesView.CARDS: + case view === IssuesView.CARDS: teamMembersView = ( ); break; - case kanbanView === IssuesView.TABLE: + case view === IssuesView.TABLE: teamMembersView = ( ); break; + + case view == IssuesView.BLOCKS: + teamMembersView = ( + + ); + break; default: teamMembersView = (
- {/* Show user name, email and image */}
diff --git a/apps/web/lib/features/team/user-team-block/index.tsx b/apps/web/lib/features/team/user-team-block/index.tsx new file mode 100644 index 000000000..a98d3ec59 --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/index.tsx @@ -0,0 +1,144 @@ +import React from 'react'; +import { secondsToTime } from '@app/helpers'; +import { useCollaborative, useTMCardTaskEdit, useTaskStatistics, useTeamMemberCard, useTimer } from '@app/hooks'; +import { IClassName, IOrganizationTeamList, ITimerStatusEnum } from '@app/interfaces'; +import { timerSecondsState } from '@app/stores'; +import { clsxm } from '@app/utils'; +import { Card, HorizontalSeparator, InputField, Text } from 'lib/components'; +import { TaskTimes, getTimerStatusValue } from 'lib/features'; +import { useTranslation } from 'react-i18next'; +import { useRecoilValue } from 'recoil'; +import { TaskBlockInfo } from './task-info'; +import { UserBoxInfo } from './user-info'; +import { UserTeamCardMenu } from './user-team-card-menu'; +import { TaskEstimateInfo } from '../user-team-card/task-estimate'; + +type IUserTeamBlock = { + active?: boolean; + member?: IOrganizationTeamList['members'][number]; + publicTeam?: boolean; + members?: IOrganizationTeamList['members']; +} & IClassName; + +const cardColorType = { + running: ' border-green-300', + idle: ' border-[#F5BEBE]', + online: ' border-green-300', + pause: ' border-[#EFCF9E]', + suspended: ' border-[#DCD6D6]' +}; + +export function UserTeamBlock({ className, active, member, publicTeam = false }: IUserTeamBlock) { + const { t } = useTranslation(); + const memberInfo = useTeamMemberCard(member); + + const taskEdition = useTMCardTaskEdit(memberInfo.memberTask); + + const { collaborativeSelect, user_selected, onUserSelect } = useCollaborative(memberInfo.memberUser); + + const seconds = useRecoilValue(timerSecondsState); + const { activeTaskTotalStat, addSeconds } = useTaskStatistics(seconds); + const { timerStatus } = useTimer(); + + const timerStatusValue: ITimerStatusEnum = React.useMemo(() => { + return getTimerStatusValue(timerStatus, member, publicTeam); + }, [timerStatus, member, publicTeam]); + + let totalWork = <>; + if (memberInfo.isAuthUser) { + const { h, m } = secondsToTime( + ((member?.totalTodayTasks && + member?.totalTodayTasks.reduce( + (previousValue, currentValue) => previousValue + currentValue.duration, + 0 + )) || + activeTaskTotalStat?.duration || + 0) + addSeconds + ); + + totalWork = ( +
+ {t('common.TOTAL_WORKED_TODAY')}: + + {h}h : {m}m + +
+ ); + } + + const menu = ( + <> + {(!collaborativeSelect || active) && } + + {collaborativeSelect && !active && ( + + )} + + ); + + return ( +
+ + {/* flex */} +
+ + {/* total time */} +
+ {totalWork} +
{menu}
+
+
+ + + + {/* Task information */} + + + + + {/* flex */} +
+
+ {/* total time */} + + {/* today time */} +
+ {/* progress time */} + +
+
+
+ ); +} diff --git a/apps/web/lib/features/team/user-team-block/task-info.tsx b/apps/web/lib/features/team/user-team-block/task-info.tsx new file mode 100644 index 000000000..2438e9fba --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/task-info.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { I_TeamMemberCardHook, I_TMCardTaskEditHook } from '@app/hooks'; +import { IClassName } from '@app/interfaces'; +import { clsxm } from '@app/utils'; +import { TaskAllStatusTypes, TaskInput, TaskNameInfoDisplay } from 'lib/features'; +import { useRouter } from 'next/router'; + +type Props = IClassName & { + edition: I_TMCardTaskEditHook; + memberInfo: I_TeamMemberCardHook; + publicTeam?: boolean; +}; + +export function TaskInfo({ className, memberInfo, edition, publicTeam }: Props) { + return ( +
+ {/* task */} +
+ {edition.task && ( + + )} + {!edition.task &&
--
} +
+ + {edition.task && } + {!edition.task &&
--
} +
+ ); +} + +export function TaskBlockInfo({ className, memberInfo, edition, publicTeam }: Props) { + return ( +
+ {/* task */} +
+ {edition.task && ( + + )} + {!edition.task &&
--
} +
+ + {edition.task && } + {!edition.task &&
--
} +
+ ); +} + +/** + * A component that is used to display the task name and also allow the user to edit the task name. + */ +function TaskDetailAndEdition({ edition, publicTeam }: Props) { + const task = edition.task; + const hasEditMode = edition.editMode && task; + const router = useRouter(); + + edition.taskEditIgnoreElement.onOutsideClick(() => { + edition.setEditMode(false); + }); + + return ( + <> + {/* Task value */} +
null : () => task && router.push(`/task/${task?.id}`)} + > + +
+ + {/* Show task input combobox when in edit mode */} +
+ {hasEditMode && ( + { + console.log(e); + }} + onEnterKey={() => { + edition.setEditMode(false); + }} + /> + )} +
+ + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-info.tsx b/apps/web/lib/features/team/user-team-block/user-info.tsx new file mode 100644 index 000000000..4b7cfbc2f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-info.tsx @@ -0,0 +1,64 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +import { I_TeamMemberCardHook, useTimer } from '@app/hooks'; +import { IClassName, ITimerStatusEnum } from '@app/interfaces'; +import { clsxm, isValidUrl } from '@app/utils'; +import { Avatar } from 'lib/components'; +// import { MailIcon } from 'lib/components/svgs'; +import { getTimerStatusValue, TimerStatus } from 'lib/features'; +import Link from 'next/link'; +import { useMemo } from 'react'; +import stc from 'string-to-color'; +import { imgTitle } from '@app/helpers'; + +type Props = { + memberInfo: I_TeamMemberCardHook; + publicTeam?: boolean; +} & IClassName; + +export function UserBoxInfo({ className, memberInfo, publicTeam = false }: Props) { + const { memberUser, member } = memberInfo; + const fullname = `${memberUser?.firstName || ''} ${memberUser?.lastName || ''}`; + + const imageUrl = useMemo(() => { + return memberUser?.image?.thumbUrl || memberUser?.image?.fullUrl || memberUser?.imageUrl || ''; + }, [memberUser?.image?.thumbUrl, memberUser?.image?.fullUrl, memberUser?.imageUrl]); + + const { timerStatus } = useTimer(); + const timerStatusValue: ITimerStatusEnum = useMemo(() => { + return getTimerStatusValue(timerStatus, member, publicTeam); + }, [timerStatus, member, publicTeam]); + + return ( + +
+ {imageUrl && isValidUrl(imageUrl) ? ( + + ) : ( +
+ {imgTitle(fullname).charAt(0)} +
+ )} + +
+ +

{fullname}

+ + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx b/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx new file mode 100644 index 000000000..93eea739f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx @@ -0,0 +1,231 @@ +import React from 'react'; +import { useOrganizationTeams, useAuthenticateUser, useModal, useUserProfilePage } from '@app/hooks'; +import { clsxm } from '@app/utils'; +import { InviteFormModal } from '../invite/invite-form-modal'; +import { taskBlockFilterState } from '@app/stores/task-filter'; +import { + PauseIcon, + SearchNormalIcon, + TimerPlayIcon, + StopCircleIcon, + NotWorkingIcon, + OnlineIcon +} from 'lib/components/svgs'; +import { Transition } from '@headlessui/react'; +import { Button, VerticalSeparator } from 'lib/components'; +import { useTaskFilter, TaskNameFilter } from 'lib/features'; +import { useRecoilState } from 'recoil'; + +interface IFilter { + running: number; + online: number; + pause: number; + idle: number; + suspended: number; +} + +export function UserTeamBlockHeader() { + // const { t } = useTranslation(); + const { activeTeam } = useOrganizationTeams(); + const { user } = useAuthenticateUser(); + const { openModal, isOpen, closeModal } = useModal(); + const [activeFilter, setActiveFilter] = useRecoilState< + 'all' | 'running' | 'online' | 'pause' | 'idle' | 'suspended' + >(taskBlockFilterState); + + const profile = useUserProfilePage(); + const hook = useTaskFilter(profile); + + const membersStatusNumber: IFilter = { + running: 0, + online: 0, + pause: 0, + idle: 0, + suspended: 0 + }; + + const members = activeTeam?.members ? activeTeam?.members : []; + members?.map((item) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + membersStatusNumber[item.timerStatus!]++; + }); + + return ( + <> +
+
+
setActiveFilter('all')} + > + +

All members

+ + {members?.length} + +
+
setActiveFilter('idle')} + > + +

Not working

+ + {membersStatusNumber.idle} + +
+
setActiveFilter('running')} + > + +

Working

+ + {membersStatusNumber.running} + +
+
setActiveFilter('pause')} + > + +

Paused

+ + {membersStatusNumber.pause} + +
+
setActiveFilter('online')} + > + +

Online

+ + {membersStatusNumber.online} + +
+
+
+ {/* */} + + + + + +
+
+
+ + {hook.filterType === 'search' && ( + { + hook.toggleFilterType('search'); + }} + /> + )} + +
+ + + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx b/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx new file mode 100644 index 000000000..b2729f60f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx @@ -0,0 +1,231 @@ +import { mergeRefs } from '@app/helpers'; +import { I_TeamMemberCardHook, I_TMCardTaskEditHook } from '@app/hooks'; +import { IClassName, ITeamTask } from '@app/interfaces'; +import { clsxm } from '@app/utils'; +import { Popover, Transition } from '@headlessui/react'; +import { Card, ConfirmDropdown, SpinnerLoader, Text } from 'lib/components'; +import { MoreIcon } from 'lib/components/svgs'; +import { TaskUnOrAssignPopover } from 'lib/features/task/task-assign-popover'; +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +type Props = IClassName & { + memberInfo: I_TeamMemberCardHook; + edition: I_TMCardTaskEditHook; +}; + +export function UserTeamCardMenu(props: Props) { + return ; +} + +function DropdownMenu({ edition, memberInfo }: Props) { + const { onAssignTask, onUnAssignTask, onRemoveMember } = useDropdownAction({ + edition, + memberInfo + }); + + const { t } = useTranslation(); + const loading = edition.loading || memberInfo.updateOTeamLoading; + + const menu = [ + { + name: t('common.EDIT_TASK'), + closable: true, + onClick: () => { + edition.task && edition.setEditMode(true); + }, + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && edition.task + }, + { + name: t('common.ESTIMATE'), + closable: true, + onClick: () => { + edition.task && edition.setEstimateEditMode(true); + }, + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && edition.task + }, + { + name: t('common.ASSIGN_TASK'), + action: 'assign', + onClick: onAssignTask, + + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && memberInfo.memberUnassignTasks.length > 0 + }, + { + name: t('common.UNASSIGN_TASK'), + action: 'unassign', + closable: true, + onClick: onUnAssignTask, + + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && !!memberInfo.memberTask + }, + { + name: memberInfo.isTeamManager ? t('common.UNMAKE_A_MANAGER') : t('common.MAKE_A_MANAGER'), + // MAke or unmake member a manager + onClick: memberInfo.isTeamManager ? memberInfo.unMakeMemberManager : memberInfo.makeMemberManager, + active: memberInfo.isAuthTeamManager && !memberInfo.isAuthUser && !memberInfo.isTeamCreator, + closable: true + }, + { + name: t('common.REMOVE'), + type: 'danger', + action: 'remove', + active: memberInfo.isAuthTeamManager && !memberInfo.isAuthUser && !memberInfo.isTeamOwner, + onClick: onRemoveMember + } + ].filter((item) => item.active || item.active === undefined); + + return ( + + {!loading && ( + + + + )} + {loading && } + + + + {({ close }) => { + return ( + +
    + {menu.map((item, i) => { + const text = ( + + {item.name} + + ); + + // When true show combobox component (AssignActionMenu) + const assignAction = item.action === 'assign'; + + const removeAction = item.action === 'remove'; + + return ( +
  • + {assignAction && ( + // Show only for item with combobox menu + { + // Can close all open combobox + item.onClick && + item.onClick({ + task, + closeCombobox1: closeCmbx, + closeCombobox2: close + }); + }} + userProfile={memberInfo.member} + usersTaskCreatedAssignTo={ + memberInfo.member?.employeeId + ? [{ id: memberInfo.member?.employeeId }] + : undefined + } + > + {text} + + )} + + {removeAction && ( + { + item.onClick && item.onClick({ close }); + }} + > + {text} + + )} + + {/* WHen hasn't an action */} + {!assignAction && !removeAction && ( + + )} +
  • + ); + })} +
+
+ ); + }} +
+
+
+ ); +} + +type IAssignCall = (params: { task?: ITeamTask; closeCombobox1?: () => void; closeCombobox2?: () => void }) => void; + +export function useDropdownAction({ edition, memberInfo }: Pick) { + const onAssignTask: IAssignCall = useCallback( + ({ task, closeCombobox1, closeCombobox2 }) => { + if (!task) return; + + edition.setLoading(true); + memberInfo.assignTask(task).finally(() => edition.setLoading(false)); + + closeCombobox1 && closeCombobox1(); + closeCombobox2 && closeCombobox2(); + }, + [edition, memberInfo] + ); + + const onUnAssignTask: IAssignCall = useCallback(() => { + if (!memberInfo.memberTask) return; + edition.setLoading(true); + + memberInfo.unassignTask(memberInfo.memberTask).finally(() => edition.setLoading(false)); + }, [memberInfo, edition]); + + const onRemoveMember = useCallback( + ({ close }: { close?: () => void }) => { + memberInfo.removeMemberFromTeam(); + close && close(); + }, + [memberInfo] + ); + + return { + onAssignTask, + onUnAssignTask, + onRemoveMember + }; +} diff --git a/apps/web/lib/features/team/user-team-card/task-estimate.tsx b/apps/web/lib/features/team/user-team-card/task-estimate.tsx index f56e9f26a..9e2e89dab 100644 --- a/apps/web/lib/features/team/user-team-card/task-estimate.tsx +++ b/apps/web/lib/features/team/user-team-card/task-estimate.tsx @@ -12,19 +12,22 @@ type Props = IClassName & { memberInfo: I_TeamMemberCardHook; edition: I_TMCardTaskEditHook; activeAuthTask: boolean; + showTime?: boolean; + radial?: boolean; }; -export function TaskEstimateInfo({ className, activeAuthTask, ...rest }: Props) { +export function TaskEstimateInfo({ className, activeAuthTask, showTime = true, radial = false, ...rest }: Props) { return (
- + {showTime && }
diff --git a/apps/web/lib/layout/main-layout.tsx b/apps/web/lib/layout/main-layout.tsx index 07e4a1b6b..27e398c26 100644 --- a/apps/web/lib/layout/main-layout.tsx +++ b/apps/web/lib/layout/main-layout.tsx @@ -34,7 +34,7 @@ export function MainLayout({ children, title, showTimer, publicTeam, notFound, c
diff --git a/apps/web/next.config.js b/apps/web/next.config.js index c1c53edea..eabcfd6e9 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const path = require('path'); +console.log(`NEXT_PUBLIC_GAUZY_API_SERVER_URL: ${process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL}`); + // eslint-disable-next-line @typescript-eslint/no-var-requires /** @type {import('next').NextConfig} */ const nextConfig = { @@ -29,19 +31,19 @@ const nextConfig = { }, // Optional build-time configuration options sentry: { // For all available options, see: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ - + // Upload a larger set of source maps for prettier stack traces (increases build time) widenClientFileUpload: true, - + // Transpiles SDK to be compatible with IE11 (increases bundle size) transpileClientSDK: true, - + // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load) tunnelRoute: '/monitoring', - + // Hides source maps from generated client bundles hideSourceMaps: true, - + // Automatically tree-shake Sentry logger statements to reduce bundle size disableLogger: true } @@ -50,9 +52,9 @@ const nextConfig = { // Injected content via Sentry wizard below const { withSentryConfig } = require('@sentry/nextjs'); -const sentryWebpackPluginOptions = { - org: process.env.SENTRY_ORG, - project: process.env.SENTRY_PROJECT, +const sentryWebpackPluginOptions = { + org: process.env.SENTRY_ORG || 'ever-co', + project: process.env.SENTRY_PROJECT || 'ever-teams-web', // An auth token is required for uploading source maps. authToken: process.env.SENTRY_AUTH_TOKEN, @@ -60,8 +62,8 @@ const sentryWebpackPluginOptions = { silent: true, // Suppresses all logs dryRun: process.env.NODE_ENV !== "production" - - // Additional config options for the Sentry Webpack plugin. + + // Additional config options for the Sentry Webpack plugin. // Keep in mind that https://github.com/getsentry/sentry-webpack-plugin#options. }; diff --git a/apps/web/package.json b/apps/web/package.json index 19d83883b..255cc564e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,6 +22,12 @@ "@heroicons/react": "^2.0.12", "@jitsi/react-sdk": "^1.3.0", "@jitsu/jitsu-react": "^1.3.0", + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/auto-instrumentations-node": "^0.40.1", + "@opentelemetry/exporter-trace-otlp-http": "^0.45.1", + "@opentelemetry/resources": "^1.18.1", + "@opentelemetry/sdk-node": "^0.45.1", + "@opentelemetry/semantic-conventions": "^1.18.1", "@popperjs/core": "^2.11.6", "@radix-ui/react-avatar": "^1.0.3", "@radix-ui/react-dialog": "^1.0.4", diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index fd09b3eac..845ca8655 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -86,6 +86,12 @@ MyApp.getInitialProps = async ({ Component, ctx }: { Component: NextPage setView(IssuesView.CARDS)} > - + +
@@ -66,13 +78,17 @@ function MainPage() {
{isTeamMember ? : null} {/* Header user card list */} - {view === IssuesView.CARDS && isTeamMember ? : null} + {view === IssuesView.CARDS && isTeamMember ? ( + + ) : view === IssuesView.BLOCKS ? ( + + ) : null} {/* Divider */} diff --git a/apps/web/pages/kanban/index.tsx b/apps/web/pages/kanban/index.tsx index 128eb1f55..589389ca3 100644 --- a/apps/web/pages/kanban/index.tsx +++ b/apps/web/pages/kanban/index.tsx @@ -1,173 +1,17 @@ +import { useKanban } from "@app/hooks/features/useKanban"; import { withAuthentication } from "lib/app/authenticator"; import { KanbanView } from "lib/features/team-members-kanban-view" import { MainLayout } from "lib/layout"; -import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; - -const todo = { - id: 'status-1', - name: 'TODO', - backgroundColor: '#8154BA', -} - -const ongoing = { - id: 'status-2', - name: 'ONGOING', - backgroundColor: '#D7EBDF', -} - -const review = { - id: 'status-3', - name: 'REVIEW', - backgroundColor: '#EAD2D5', -} - -export const state = [ todo, ongoing, review] - -const demoData = { - todo: [ - { - id: '1', - content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', - hasComment: "tagged", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#8154BA', - color: '#fff' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD2D5', - color: '#DD2F44' - }, - ], - status: todo - }, - { - id: '4', - content: 'demo content2', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD9EE', - color: '#9641AB' - }, - ], - status: todo - } - ], - ongoing: [ - { - id: '2', - content: 'another content', - hasComment: "untagged", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#EAD9EE', - color: '#9641AB' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD2D5', - color: '#DD2F44' - }, - ], - status: ongoing - }, - { - id: '5', - content: 'another content2', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#8154BA', - color: '#fff' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: ongoing - } - ], - review: [ - { - id: '3', - content: 'a simple tes', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: review - }, - { - id: '6', - content: 'a simple tes', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: review - } - ]} const Kanban= () => { - const router = useRouter() - const [winReady, setwinReady] = useState(false); - - useEffect(() => { - - setwinReady(true); - - - }, [router.isReady]); - + + const { data } = useKanban(); + return ( <> - {winReady ? - + {Object.keys(data).length > 0 ? + : null } diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css index d89958e13..3645fa0be 100644 --- a/apps/web/styles/globals.css +++ b/apps/web/styles/globals.css @@ -9,6 +9,10 @@ --tooltipBackground: #000; } +body { + @apply bg-[#F2F2F2]; +} + html.dark { --tooltipBackground: #000; } @@ -297,3 +301,10 @@ html.dark { transform: scale(1.2); } } + +.progress-ring__circle { + stroke-dasharray: 400, 400; + transition: stroke-dashoffset 0.35s; + transform: rotate(-90deg); + transform-origin: 50% 50%; +} diff --git a/northflank-template.json b/northflank-template.json new file mode 100644 index 000000000..64de68c2d --- /dev/null +++ b/northflank-template.json @@ -0,0 +1,59 @@ +{ + "apiVersion": "v1", + "spec": { + "kind": "Workflow", + "spec": { + "type": "sequential", + "steps": [ + { + "kind": "DeploymentService", + "spec": { + "deployment": { + "instances": 1, + "docker": { + "configType": "default" + }, + "external": { + "imagePath": "ghcr.io/ever-co/ever-teams-webapp:latest" + } + }, + "runtimeEnvironment": {}, + "runtimeFiles": {}, + "billing": { + "deploymentPlan": "nf-compute-10" + }, + "name": "ever-teams-web", + "ports": [ + { + "internalPort": 3000, + "protocol": "HTTP", + "public": true, + "name": "p01", + "domains": [], + "security": { + "policies": [], + "credentials": [] + }, + "disableNfDomain": false + } + ] + } + } + ] + } + }, + "name": "ever-teams-template", + "description": "Open Work and Project Management Platform.", + "project": { + "spec": { + "name": "Ever Teams Template", + "region": "europe-west", + "description": "Open Work and Project Management Platform.", + "color": "#3826A6", + "networking": { + "allowedIngressProjects": [] + } + } + }, + "$schema": "https://api.northflank.com/v1/schemas/template" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 94a10c29b..222b68347 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2364,6 +2364,14 @@ "@grpc/proto-loader" "^0.7.8" "@types/node" ">=12.12.47" +"@grpc/grpc-js@^1.7.1": + version "1.9.12" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.12.tgz#a45b23a7d9ee1eadc9fa8fe480e27edbc6544cdd" + integrity sha512-Um5MBuge32TS3lAKX02PGCnFM4xPT996yLgZNb5H03pn6NyJ4Iwn5YcPq6Jj9yxGRk7WOgaZFtVRH5iTdYBeUg== + dependencies: + "@grpc/proto-loader" "^0.7.8" + "@types/node" ">=12.12.47" + "@grpc/proto-loader@^0.5.0": version "0.5.6" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d" @@ -2382,6 +2390,77 @@ protobufjs "^7.2.4" yargs "^17.7.2" +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bourne@2.x.x": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/iron@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/podium@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" + integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/teamwork" "5.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/teamwork@5.x.x": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" + integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/validate@1.x.x": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" + integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@headlessui/react@^1.7.7": version "1.7.17" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.17.tgz#a0ec23af21b527c030967245fd99776aa7352bc6" @@ -4320,6 +4399,643 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@opentelemetry/api-logs@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.1.tgz#9e4f2c652dcce798c5627939b22304c2b5ce19c5" + integrity sha512-zVGq/k70l+kB/Wuv3O/zhptP2hvDhEbhDu9EtHde1iWZJf3FedeYS/nWVcMBkkyPAjS/JKNk86WN4CBQLGUuOw== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40" + integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw== + +"@opentelemetry/auto-instrumentations-node@^0.40.1": + version "0.40.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.40.1.tgz#806204b0580c7f7269c8e4c42a0de11b4cddfc93" + integrity sha512-GlXxM3zVSeJn9uKFc9T+FqVrDrnDTGOrZVC3EYX1c+ocl7zoIeyoLiGKNgY/0GkngbyqoDb1O//qtWA58TI91g== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/instrumentation-amqplib" "^0.33.4" + "@opentelemetry/instrumentation-aws-lambda" "^0.37.2" + "@opentelemetry/instrumentation-aws-sdk" "^0.37.0" + "@opentelemetry/instrumentation-bunyan" "^0.33.0" + "@opentelemetry/instrumentation-cassandra-driver" "^0.34.1" + "@opentelemetry/instrumentation-connect" "^0.32.3" + "@opentelemetry/instrumentation-cucumber" "^0.1.2" + "@opentelemetry/instrumentation-dataloader" "^0.5.3" + "@opentelemetry/instrumentation-dns" "^0.32.4" + "@opentelemetry/instrumentation-express" "^0.33.3" + "@opentelemetry/instrumentation-fastify" "^0.32.4" + "@opentelemetry/instrumentation-fs" "^0.8.3" + "@opentelemetry/instrumentation-generic-pool" "^0.32.4" + "@opentelemetry/instrumentation-graphql" "^0.36.0" + "@opentelemetry/instrumentation-grpc" "^0.45.1" + "@opentelemetry/instrumentation-hapi" "^0.33.2" + "@opentelemetry/instrumentation-http" "^0.45.1" + "@opentelemetry/instrumentation-ioredis" "^0.36.0" + "@opentelemetry/instrumentation-knex" "^0.32.3" + "@opentelemetry/instrumentation-koa" "^0.36.2" + "@opentelemetry/instrumentation-lru-memoizer" "^0.33.4" + "@opentelemetry/instrumentation-memcached" "^0.32.4" + "@opentelemetry/instrumentation-mongodb" "^0.37.3" + "@opentelemetry/instrumentation-mongoose" "^0.33.4" + "@opentelemetry/instrumentation-mysql" "^0.34.4" + "@opentelemetry/instrumentation-mysql2" "^0.34.4" + "@opentelemetry/instrumentation-nestjs-core" "^0.33.3" + "@opentelemetry/instrumentation-net" "^0.32.3" + "@opentelemetry/instrumentation-pg" "^0.37.1" + "@opentelemetry/instrumentation-pino" "^0.34.3" + "@opentelemetry/instrumentation-redis" "^0.35.4" + "@opentelemetry/instrumentation-redis-4" "^0.35.5" + "@opentelemetry/instrumentation-restify" "^0.34.2" + "@opentelemetry/instrumentation-router" "^0.33.3" + "@opentelemetry/instrumentation-socket.io" "^0.34.4" + "@opentelemetry/instrumentation-tedious" "^0.6.4" + "@opentelemetry/instrumentation-winston" "^0.33.0" + "@opentelemetry/resource-detector-alibaba-cloud" "^0.28.4" + "@opentelemetry/resource-detector-aws" "^1.3.4" + "@opentelemetry/resource-detector-container" "^0.3.4" + "@opentelemetry/resource-detector-gcp" "^0.29.4" + "@opentelemetry/resources" "^1.12.0" + "@opentelemetry/sdk-node" "^0.45.1" + +"@opentelemetry/context-async-hooks@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.18.1.tgz#d9eb17e23e469f85b44ca1c4788c42a06a62cc84" + integrity sha512-HHfJR32NH2x0b69CACCwH8m1dpNALoCTtpgmIWMNkeMGNUeKT48d4AX4xsF4uIRuUoRTbTgtSBRvS+cF97qwCQ== + +"@opentelemetry/core@1.18.1", "@opentelemetry/core@^1.0.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.8.0": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9" + integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg== + dependencies: + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-grpc@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.45.1.tgz#46d2336444bbf1f33ab1ffa565dcb32460323c94" + integrity sha512-c/Wrn6LUqPiRgKhvMydau6kPz4ih6b/uwospiavjXju98ZfVv+KjaIF13cblW+4cQ6ZR3lm7t66umQfXrGBhPQ== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-grpc-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-http@0.45.1", "@opentelemetry/exporter-trace-otlp-http@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.45.1.tgz#2265181bd4787dc6660bdac33d658490a883283a" + integrity sha512-a6CGqSG66n5R1mghzLMzyzn3iGap1b0v+0PjKFjfYuwLtpHQBxh2PHxItu+m2mXSwnM4R0GJlk9oUW5sQkCE0w== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-proto@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.45.1.tgz#57f786815ae0b5884459195e2044f58c6ba57e7b" + integrity sha512-8QI6QARxNP4y9RUpuQxXjw2HyRNyeuD9CWEhS5ON44Mt+XP7YbOZR3GLx2Ml2JZ8uzB5dd2EGlMgaMuZe36D5Q== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + "@opentelemetry/otlp-proto-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-zipkin@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.18.1.tgz#01e7bd854971a81ae22ac1b3417e61017d074d44" + integrity sha512-RmoWVFXFhvIh3q4szUe8I+/vxuMR0HNsOm39zNxnWJcK7JDwnPra9cLY/M78u6bTgB6Fte8GKgU128vvDzz0Iw== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/instrumentation-amqplib@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.33.4.tgz#1acccf3ae3efb41a56faf9be1460ef15ffb72caf" + integrity sha512-fL+WrEsIM3cP4VTOsqR8enlT/4VX+OCVF7WALN85bgdFPSRpv2X7ZqsXOdYd358cAp4KO9MiveSkAKwKcTXKLw== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-aws-lambda@^0.37.2": + version "0.37.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.37.2.tgz#37f4f0a4d6bd7f02276ec0aaa1264a92c0af7938" + integrity sha512-PJnbfI2A/0t3HY/iMwtBzMYEhhNkdqu4eXkAt7d8x2atUwGYN/OfQXnyKy0+OHxjL62Ek9eab8AFxNHzJID0kA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/propagator-aws-xray" "^1.3.1" + "@opentelemetry/resources" "^1.8.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/aws-lambda" "8.10.122" + +"@opentelemetry/instrumentation-aws-sdk@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.37.0.tgz#646504798ce397321bac66efde88a77fdc250269" + integrity sha512-xtu7RKk4sYqJVe0PAhIC2m/ag9JO2XyZKjV2P1iOT029ZYOfDQ1RPMFHtm9z73uC9WggPS0eqQYVKP25E5ocwA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/propagation-utils" "^0.30.4" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-bunyan@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.33.0.tgz#6df62168a7cc6ff3f3fc323e6398ccfc8a51a176" + integrity sha512-i3xfmhajtOEuFO+9yMU/wJiH0tY4VtIlbJKGIKVHFOsoNqPQpG7iUQP01p0FRoje+UB+ZUvs4hU7fCZzwtnC1g== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@types/bunyan" "1.8.9" + +"@opentelemetry/instrumentation-cassandra-driver@^0.34.1": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.34.1.tgz#d81b4e5c1b1061e92d99e342e87a9e853de8876c" + integrity sha512-n2bjMeKctNpXYW/vHURMCOXm56HFgQiD4fyIWioUvLROaPunKDvQpJlCLS88QMQ3f3pz/fp8Bde6gXuciLePxQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-connect@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.32.3.tgz#cf9d20ebc4e01670af8df4eec92f8f91a28d6bf5" + integrity sha512-5BK52mIjNuKgY/RV8h0GLmS4qunXqkCIL7NZ73dJ40pnKMA8jqF5D5A2tFjWkCCQ4BdYfAfyjjiA+uTGoL3ZGg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/connect" "3.4.36" + +"@opentelemetry/instrumentation-cucumber@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.1.2.tgz#171759a79391fc619eeb51b46895dfb21ec669e9" + integrity sha512-+TaM9hD256nuPrcnuy8UpiJbuMFUR/zW0K1nLgcDvJyR5TEhKmBPqDfUQzy1i+zyeJM4NiyqZoOCW6iTQnMPoA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-dataloader@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.5.3.tgz#b50d80f2c9937014c5199bcee1fe1f751100bf69" + integrity sha512-tHpLbcjtdiDFLHFfYjmyKjnDYCQLmp6ceflsA9H4BEEwSE2p5ZW512TQl3abzb3EQK2V7+I1gqIuMGHKxmKIlg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-dns@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.32.4.tgz#58e872c0a781d9d95916841cab2b5a12fb5e3f83" + integrity sha512-04DTRKFDEpKgYpCqPGlnpCS0atuRUmAPj35xNGV/H7bZTCA3ZR77NeR3f4tYVfqlnsi3KiM1HzgrhwNBskVIEw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + semver "^7.5.4" + +"@opentelemetry/instrumentation-express@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.33.3.tgz#3786aa443652207edcd9e86d10ae74dda8001004" + integrity sha512-Vnt2KT/HnFo0533vyr1l4CV46dBp2KfVVVgu3wdo0ORr1FBhThCw5yvfBUffK/ZS0aTzfJ1ZyJm10qm4h6Prgg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/express" "4.17.18" + +"@opentelemetry/instrumentation-fastify@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.32.4.tgz#5c183a65a28cc4d09d3d1f41e76e4e79370b4ce2" + integrity sha512-uAgH8M483yP2eezc+xnuViOkIq3kzD3+gX9RfPCp9zNA1JV/CIe3i34+CkelBRtI62PyiTijrCxHykCcm5uAXQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-fs@^0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.8.3.tgz#f801c895c366ca5aa2c3f4e93ed44bb579a5ec70" + integrity sha512-o5uy91VAvXl1i71/AH3C6KV/6KQVGsnuNmjfUAJo4QqY2ta0Uzlpa0wy0nXvQUAP/3QbTx7NcF3rk3mVxLmgeg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-generic-pool@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.32.4.tgz#9267f22e0b46f4778120fe8b53939f3eafa80dbe" + integrity sha512-NDNzoZ0MCmHeMQRxm1eL0l8fCoHIYFiugu5AZ4wt+S2wbgyh5BCd+ZAqTzSFEJGKGg7KZMfHgVRTiCsj+ljfvA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-graphql@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.36.0.tgz#e885fcca849ab63c81a0f2eae31ef6f2f3ab9c67" + integrity sha512-H5nezZCV4HUjmPi4o2QlFXGzvldZiJ7hAEldy+37qMmm5PaqLmFW4w084/C+4IdPoxm4gJRtI8vkXJQJqqyktQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-grpc@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.45.1.tgz#e4ae7285d8fff0d7c93db1c9c1e7b0164748520f" + integrity sha512-KyssKMi+cMAWc+9buGs7nHjnHm4wQPH99etunFblZCKQlzgPB+s8Q6aIlJ3LCkCaOGAhofpr4IkWh7dMcapJJQ== + dependencies: + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/instrumentation-hapi@^0.33.2": + version "0.33.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.33.2.tgz#59fc1c54e5d496c9c5e7eb6ed1225e1d14d24b5e" + integrity sha512-XSe1/emVguKMEiV+ctva+Z9GI/3scPBwtNFAVcJFpM4ekK0SiIF73uBKmaC0mVnU+TIToPlkOC7nbkEbXq6y1g== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/hapi__hapi" "20.0.13" + +"@opentelemetry/instrumentation-http@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.45.1.tgz#d337aac0e46ded596db594ed587035a993b78707" + integrity sha512-ph7kv38Lipg/ggvoNJrwc3RCceLnTkVZwRbE5iu6w7fGsMjjc9jwlSmaOXKxUJjIimil2hL1qBm8xg2lmOVwxg== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/semantic-conventions" "1.18.1" + semver "^7.5.2" + +"@opentelemetry/instrumentation-ioredis@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.36.0.tgz#53fc0f0342b25813b2db7378c7b2d37e678ac0e8" + integrity sha512-LmEHE3w8JzPpm2TEPiwjAjOSIPWM6t39TFNXu796IJba35k0ZZG9qQRaxv8CS61EZIT1eH7qgExHwEmPHsOl8Q== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/ioredis4" "npm:@types/ioredis@^4.28.10" + +"@opentelemetry/instrumentation-knex@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.32.3.tgz#c2e51f2f0563834a1d963d811cac02ff33ee819b" + integrity sha512-8+JvZ1Gs9pMe6pgQfMVjth52WCUuKUu0L0tx237VAA53HHUtsCNPznBHp2EAlsLGSLLptfPvzXz/Bdp009ja8w== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-koa@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.36.2.tgz#141ee9a4a25bfd01b283c9ec07e302a3bc90f6e5" + integrity sha512-93DjNOvZRBoqIRg4B+HI6k9vV7FcxfhN8c5/7HvzdUyaQ+GJzWMhTwpz9/P1K9NTEZA4+mNuD/BR3kzKJo52EQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/koa" "2.13.9" + "@types/koa__router" "12.0.3" + +"@opentelemetry/instrumentation-lru-memoizer@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.33.4.tgz#e41c63fe2ec105aa7f6ea8604f75f04b1818eb10" + integrity sha512-SOO9y15z27n5VpjjHiT1r1H+uNxBHRaHX1z6DhGG0BjaJkyu9p6CSjXhsXu2gsAoubRKMSAd0Q+axf1MiVqhvw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-memcached@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.32.4.tgz#1bd7ff775c089dabe771191ba76b4164eea25685" + integrity sha512-q9uswokVrtgKFiVNb3QoTFFulXiHpm6FDOvI/3uO8/TnhhpUh776EuD5kDI0YWZ3J+gkN2Dj82KrmOfqBS5o1A== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/memcached" "^2.2.6" + +"@opentelemetry/instrumentation-mongodb@^0.37.3": + version "0.37.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.37.3.tgz#1a6690c4e8b7844b04db51a00ce9c75abd8300a6" + integrity sha512-RraVhFVy+vD4nApxORSqnKTWJ+tQLn1w+ipAXwk2IWgcDDCurfaIg6xIYzowvmx7rSkP2phUF07kAcQXiPapMQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mongoose@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.33.4.tgz#ab275cb9452f034fea1fbb0305bd1f5d6dc97f94" + integrity sha512-qPwurJjzxJVIzvlRmN4KADQ+BeD2KsDcEH7fMRPMZ35R90+0fQO3RFmINaO5zUpmYY1tHsw3zhnQVD23Dq+pfA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mysql2@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.34.4.tgz#cdfe4d6c127a1287e5618f8b3b2e662f66c46bb2" + integrity sha512-pgf7UUMiQFUbfzj2WkjOdzT8IoffsqlAbIdMobyAc2Ca90fIYrpEeIpurkzDJWsw1x4GaQRXmJuERhccgr5BSg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + +"@opentelemetry/instrumentation-mysql@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.34.4.tgz#24a5fe176b23cecc6ac5f4ee665ad4d4ac211bd3" + integrity sha512-LWpCGoKuSoHYIzI/SN3unkNkthdFHGyA3vJJWPmtLPxEP9qtCc2gAJUQQ6Q+73YJmHZdXlZSe7sOqGdKx/KyjQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/mysql" "2.15.22" + +"@opentelemetry/instrumentation-nestjs-core@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.33.3.tgz#40bbf1acfccee2e371af71ef6f7edcd5dfc3d80f" + integrity sha512-B5v8Qi0chpHHgp/BeL5EcxQnnjm6OTYiMlGk6rM5X/xz9AdB60fAIXWerKKrG1QQ8JVcS5O4nhP4NzPC0JLjWw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-net@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-net/-/instrumentation-net-0.32.3.tgz#10214094bab7a30d6ed6e4dcefe2f7c146f1239e" + integrity sha512-v8TiTNk0v78HPsrKclGOwtMQXSfCKBIsZ0IP6dweTHtwdrX905BBdsnnCLyo28UkqybJ1BH0ulf7uk6BrqjfmA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-pg@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.37.1.tgz#d889691f699718cbbf672f52dcf15ab9d1fd39b2" + integrity sha512-yJcTdwsnFqHLFR+uaS2mIvXfHnlzSD2VWgSvka9Y3SSZepcpiEbVs9G897p0XVNpNImo4+CfhOD6Mh5kL6o7Vg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + "@types/pg" "8.6.1" + "@types/pg-pool" "2.0.4" + +"@opentelemetry/instrumentation-pino@^0.34.3": + version "0.34.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.34.3.tgz#86a3b704b9af6c89f1b487ef2effa885d17dc4bf" + integrity sha512-b2ZWogLb8JsdiB//cb1/8Fq3nXKnejSrNy5iArpC5eapVkJ7zq9jj7/Y0q8nKcK5I5bud1aztRe5K754SQ5LlQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-redis-4@^0.35.5": + version "0.35.5" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.35.5.tgz#b0f00f055be05c1662636d4312c6f10a81e092cc" + integrity sha512-+CuWyS1QOc/RYGSyLr/3VkXiNVU4rstsJi+b5j1sh4Mzy4sIrOtRQRcl74PXh06vOnSyGTToyQ9n4BKZuHODbQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-redis@^0.35.4": + version "0.35.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.35.4.tgz#818d62b49294eed308aa4387e4e3d2c6a2c0935d" + integrity sha512-MNO/cuHQMeafNu+K8PdrZDGPjWLsQTmyfJzzjasQgm6ELe+/6deNZzsAXkRK4e4sx+FJH7NDnyyqti/dhB4IeQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-restify@^0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.34.2.tgz#f1fa78ad188441b5d65c85657f7c869479ffd62e" + integrity sha512-W9fZJ6hH7PNIhzcKcmFjUgU87vnM1gPa/YTW724lZ9ItHPUol4wAcnv/F88xM+eouuZKLmCaCahZYp0tx7D/Ig== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-router@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-router/-/instrumentation-router-0.33.3.tgz#ffd3a9a224a95249c88e35e317ed69223d4b6a88" + integrity sha512-LbD+9YBx4SKK10WQ06s2iy9/tN9lQmlgneqem46WKi8rX0W2vo1VX5TEM+Bvn7d5lM5uaPDFGosQR++g52BSDQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-socket.io@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.34.4.tgz#de8d93e70f8520c7de017766afa8c873076551f9" + integrity sha512-r56esRFNEULo8p4iJ0xsd3JkzUPPtLrIeiX0YnqI5hzaoOz3bmUO7qu6/iiEX9/Ej9/rL0U5ZaEIEmagJIUcIw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-tedious@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.6.4.tgz#b7eafdbf514c0cc88146c4fbd44553acd8dfb6f6" + integrity sha512-bjoagT4AO26QXpv7bE4Vyrwcqxq0ntA2pWCLDHuXRnlt+iWyQm4dS/ExjQR4OuO8aRgeuk/3YC7dSl1rtdO7Kg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/tedious" "^4.0.10" + +"@opentelemetry/instrumentation-winston@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.33.0.tgz#b93979eb8e908d964035ffbd70205985bf9c71c1" + integrity sha512-kf4GC6/IVDt+XumUZ54kB3G+1Kc3TfaLY63uZ+9Qi25LBPeBSYJHQugSvxZ9mK/5Uyf9rPxW2FevjblNyaY54w== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation@0.45.1", "@opentelemetry/instrumentation@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.45.1.tgz#043ac90a889fae8a551c8d06e16be443984449af" + integrity sha512-V1Cr0g8hSg35lpW3G/GYVZurrhHrQZJdmP68WyJ83f1FDn3iru+/Vnlto9kiOSm7PHhW+pZGdb9Fbv+mkQ31CA== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.4.2" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + +"@opentelemetry/otlp-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.45.1.tgz#7170ec200152f89d74b2cf82fcf21fd32deebf03" + integrity sha512-Jvd6x8EwWGKEPWF4tkP4LpTPXiIkkafMNMvMJUfJd5DyNAftL1vAz+48jmi3URL2LMPkGryrvWPz8Tdu917gQw== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/otlp-grpc-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.45.1.tgz#2b2cb53cbedd169d7638b81c1253ae7e99a4b2d3" + integrity sha512-81X4mlzaAFoQCSXCgvYoMFyTy3mBhf8DD3J8bjW6/PH/rGZPJJkyYW0/YzepMrmBZXqlKZpTOU1aJ8sebVvDvw== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-proto-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.45.1.tgz#791129f256f6c3ae298e0cd96020eaa65d7a0689" + integrity sha512-jtDkly6EW8TZHpbPpwJV9YT5PgbtL5B2UU8zcyGDiLT1wkIAYjFJZ1AqWmROIpydu8ohMq0dRwe4u0izNMdHpA== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-transformer@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.1.tgz#8f6590b93f177510983bea3055e5a3f3d30faad2" + integrity sha512-FhIHgfC0b0XtoBrS5ISfva939yWffNl47ypXR8I7Ru+dunlySpmf2TLocKHYLHGcWiuoeSNO5O4dZCmSKOtpXw== + dependencies: + "@opentelemetry/api-logs" "0.45.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-logs" "0.45.1" + "@opentelemetry/sdk-metrics" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/propagation-utils@^0.30.4": + version "0.30.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagation-utils/-/propagation-utils-0.30.4.tgz#a5f28249066374742608b91a8bad02f945e8dc00" + integrity sha512-drYvwfhdXZ6ax5xnpuEQ/0C0AaCcxXcf47wZFNIK4DZu2RJmGk24XUSGWg5XI9gMKBe5qwXWBh9aSlSLWdA/Ww== + +"@opentelemetry/propagator-aws-xray@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz#7fc77a95fe89c705442b0e5a4218422c2954cc07" + integrity sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + +"@opentelemetry/propagator-b3@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.18.1.tgz#e7be021bebdb1851eb9322a6f70bbc8d688b6ec8" + integrity sha512-oSTUOsnt31JDx5SoEy27B5jE1/tiPvvE46w7CDKj0R5oZhCCfYH2bbSGa7NOOyDXDNqQDkgqU1DIV/xOd3f8pw== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/propagator-jaeger@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.18.1.tgz#9ce06ba88a375a27d9e0670280307d88c5c99951" + integrity sha512-Kh4M1Qewv0Tbmts6D8LgNzx99IjdE18LCmY/utMkgVyU7Bg31Yuj+X6ZyoIRKPcD2EV4rVkuRI16WVMRuGbhWA== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/redis-common@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz#79bca902603dd27862223a751be0f4bb0be54c2b" + integrity sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw== + +"@opentelemetry/resource-detector-alibaba-cloud@^0.28.4": + version "0.28.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.4.tgz#2396ef2d86ca1e541099abba691955b17ad12e90" + integrity sha512-acesz8NgW6asYZNWJvLT/PwaM18iFaVgiEkhPEVtAberyl9+l+e8FBSvCFgV6KSAPnBMbdv11dkN1dSAAqqREg== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-aws@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.4.tgz#5b851817b58217daae9c5498533176884dee07ad" + integrity sha512-G6QK5kcLbqxF4zNFfuXyqZtWecNzwKVVqo/gEXlF3EZSIImPH2bGkElL8HpW9OGktWCqbbjYRTSo8VEjs6PxWA== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-container@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.4.tgz#eb9d3bc503bb94de2994874f353f49b13a850ceb" + integrity sha512-p04SnseEk5P18T+90LscSdMYmehrn+paoLgE3s0BEusA+FDail1jRD0SsnoTHO94SM0XePIeaG6ip2n4Id9+8Q== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-gcp@^0.29.4": + version "0.29.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.4.tgz#1b5aee09bc520c9b3c902c5f2cd0ea6bff2a98a7" + integrity sha512-YoUYYwjcCRRxkHHFco29Hli+dVrIPMDTkJqQ0BaH4MDkfFg4HEbO/WarNHxSv5wAIl3SiI4sYyNJ6qfK5Z92zQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + gcp-metadata "^6.0.0" + +"@opentelemetry/resources@1.18.1", "@opentelemetry/resources@^1.0.0", "@opentelemetry/resources@^1.12.0", "@opentelemetry/resources@^1.18.1", "@opentelemetry/resources@^1.8.0": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7" + integrity sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-logs@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.1.tgz#d59a99147ab15eb36757932517dfc9a10e1645e9" + integrity sha512-z0RRgW4LeKEKnhXS4F/HnqB6+7gsy63YK47F4XAJYHs4s1KKg8XnQ2RkbuL31i/a9nXkylttYtvsT50CGr487g== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + +"@opentelemetry/sdk-metrics@1.18.1", "@opentelemetry/sdk-metrics@^1.9.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3" + integrity sha512-TEFgeNFhdULBYiCoHbz31Y4PDsfjjxRp8Wmdp6ybLQZPqMNEb+dRq+XN8Xw3ivIgTaf9gYsomgV5ensX99RuEQ== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-node@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.45.1.tgz#86e238e9dae5187132d0a2a506caeedd098071c3" + integrity sha512-VtYvlz2ydfJLuOUhCnGER69mz2KUYk3/kpbqI1FWlUP+kzTwivMuy7hIPPv6KmuOIMYWmW4lM+WyJACHqNvROw== + dependencies: + "@opentelemetry/api-logs" "0.45.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/exporter-trace-otlp-grpc" "0.45.1" + "@opentelemetry/exporter-trace-otlp-http" "0.45.1" + "@opentelemetry/exporter-trace-otlp-proto" "0.45.1" + "@opentelemetry/exporter-zipkin" "1.18.1" + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-logs" "0.45.1" + "@opentelemetry/sdk-metrics" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + "@opentelemetry/sdk-trace-node" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-trace-base@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379" + integrity sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-trace-node@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.18.1.tgz#ec35ff9abf89244c4fde1c550645d4effa2d7aba" + integrity sha512-ML0l9TNlfLoplLF1F8lb95NGKgdm6OezDS3Ymqav9sYxMd5bnH2LZVzd4xEF+ov5vpZJOGdWxJMs2nC9no7+xA== + dependencies: + "@opentelemetry/context-async-hooks" "1.18.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/propagator-b3" "1.18.1" + "@opentelemetry/propagator-jaeger" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + semver "^7.5.2" + +"@opentelemetry/semantic-conventions@1.18.1", "@opentelemetry/semantic-conventions@^1.0.0", "@opentelemetry/semantic-conventions@^1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4" + integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA== + +"@opentelemetry/sql-common@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz#8cbed0722354d62997c3b9e1adf0e16257be6b15" + integrity sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw== + dependencies: + "@opentelemetry/core" "^1.1.0" + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -5258,6 +5974,23 @@ "@sentry/cli" "^1.74.6" webpack-sources "^2.0.0 || ^3.0.0" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sigstore/bundle@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" @@ -5527,11 +6260,23 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" +"@types/accepts@*": + version "1.3.7" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" + integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ== + dependencies: + "@types/node" "*" + "@types/aria-query@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== +"@types/aws-lambda@8.10.122": + version "8.10.122" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.122.tgz#206c8d71b09325d26a458dba27db842afdc54df1" + integrity sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw== + "@types/babel__core@^7.1.14": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" @@ -5580,6 +6325,13 @@ dependencies: "@types/node" "*" +"@types/bunyan@1.8.9": + version "1.8.9" + resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.9.tgz#22d4517f3217b7c8f5a69bbc8c9f6df79779dcb5" + integrity sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw== + dependencies: + "@types/node" "*" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.0" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" @@ -5595,6 +6347,18 @@ dependencies: "@types/node" "*" +"@types/connect@3.4.36": + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537" + integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg== + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -5605,6 +6369,16 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.1.tgz#b29aa1f91a59f35e29ff8f7cb24faf1a3a750554" integrity sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g== +"@types/cookies@*": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.10.tgz#c4881dca4dd913420c488508d192496c46eb4fd0" + integrity sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + "@types/detox@^18.1.0": version "18.1.0" resolved "https://registry.yarnpkg.com/@types/detox/-/detox-18.1.0.tgz#5d204f08c8db3a03827f9146b043fc2421327753" @@ -5653,6 +6427,16 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@4.17.18": + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -5660,6 +6444,39 @@ dependencies: "@types/node" "*" +"@types/hapi__catbox@*": + version "10.2.6" + resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz#e516bfb4e461441b4ea7f9be870e48864a289494" + integrity sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w== + +"@types/hapi__hapi@20.0.13": + version "20.0.13" + resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz#ea8ce83c192f6e8106f6e76e40f795e7e36d0615" + integrity sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ== + dependencies: + "@hapi/boom" "^9.0.0" + "@hapi/iron" "^6.0.0" + "@hapi/podium" "^4.1.3" + "@types/hapi__catbox" "*" + "@types/hapi__mimos" "*" + "@types/hapi__shot" "*" + "@types/node" "*" + joi "^17.3.0" + +"@types/hapi__mimos@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz#4f8a1c58345fc468553708d3cb508724aa081bd9" + integrity sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ== + dependencies: + "@types/mime-db" "*" + +"@types/hapi__shot@*": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/hapi__shot/-/hapi__shot-4.1.6.tgz#ee45d9a4a4e109a8d623e4f5f58ae2d8bd7c0773" + integrity sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg== + dependencies: + "@types/node" "*" + "@types/hoist-non-react-statics@^3.3.0": version "3.3.4" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz#cc477ce0283bb9d19ea0cbfa2941fe2c8493a1be" @@ -5668,6 +6485,11 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/http-assert@*": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.5.tgz#dfb1063eb7c240ee3d3fe213dac5671cfb6a8dbf" + integrity sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g== + "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -5680,6 +6502,13 @@ dependencies: "@types/node" "*" +"@types/ioredis4@npm:@types/ioredis@^4.28.10": + version "4.28.10" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz#40ceb157a4141088d1394bb87c98ed09a75a06ff" + integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== + dependencies: + "@types/node" "*" + "@types/is-hotkey@^0.1.1": version "0.1.7" resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.7.tgz#30ec6d4234895230b576728ef77e70a52962f3b3" @@ -5726,6 +6555,53 @@ dependencies: "@types/node" "*" +"@types/keygrip@*": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740" + integrity sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ== + +"@types/koa-compose@*": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.8.tgz#dec48de1f6b3d87f87320097686a915f1e954b57" + integrity sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.12" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.12.tgz#70d87a9061a81909e0ee11ca50168416e8d3e795" + integrity sha512-vAo1KuDSYWFDB4Cs80CHvfmzSQWeUb909aQib0C0aFx4sw0K9UZFz2m5jaEP+b3X1+yr904iQiruS0hXi31jbw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.13.9": + version "2.13.9" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.9.tgz#8d989ac17d7f033475fbe34c4f906c9287c2041a" + integrity sha512-tPX3cN1dGrMn+sjCDEiQqXH2AqlPoPd594S/8zxwUm/ZbPsQXKqHPUypr2gjCPhHUc+nDJLduhh5lXI/1olnGQ== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__router@12.0.3": + version "12.0.3" + resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-12.0.3.tgz#3fb74ea1991cadd6c6712b6106657aa6e64afca4" + integrity sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw== + dependencies: + "@types/koa" "*" + "@types/lodash@^4.14.149", "@types/lodash@^4.14.175": version "4.14.197" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" @@ -5736,6 +6612,18 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== +"@types/memcached@^2.2.6": + version "2.2.10" + resolved "https://registry.yarnpkg.com/@types/memcached/-/memcached-2.2.10.tgz#113f9e3a451d6b5e0a3822e06d9feb52e63e954a" + integrity sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg== + dependencies: + "@types/node" "*" + +"@types/mime-db@*": + version "1.43.5" + resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.5.tgz#7a3f53dc2125a91f4e0e41f1353f60f8b6af609e" + integrity sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -5756,6 +6644,13 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mysql@2.15.22": + version "2.15.22" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.22.tgz#8705edb9872bf4aa9dbc004cd494e00334e5cdb4" + integrity sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ== + dependencies: + "@types/node" "*" + "@types/node@*": version "20.5.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" @@ -5806,6 +6701,31 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pg-pool@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.4.tgz#b5c60f678094ff3acf3442628a7f708928fcf263" + integrity sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ== + dependencies: + "@types/pg" "*" + +"@types/pg@*": + version "8.10.9" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.10.9.tgz#d20bb948c6268c5bd847e2bf968f1194c5a2355a" + integrity sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^4.0.1" + +"@types/pg@8.6.1": + version "8.6.1" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9" + integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -5916,6 +6836,11 @@ "@types/mime" "*" "@types/node" "*" +"@types/shimmer@^1.0.2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.5.tgz#491d8984d4510e550bfeb02d518791d7f59d2b88" + integrity sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww== + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -5938,6 +6863,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tedious@^4.0.10": + version "4.0.14" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1" + integrity sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw== + dependencies: + "@types/node" "*" + "@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -7211,6 +8143,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.0.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + bin-links@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-2.3.0.tgz#1ff241c86d2c29b24ae52f49544db5d78a4eb967" @@ -8037,7 +8974,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^1.0.0: +cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== @@ -10951,7 +11888,7 @@ ext@^1.1.2: dependencies: type "^2.7.2" -extend@~3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -11547,6 +12484,24 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaxios@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.1.tgz#549629f86a13e756b900f9ff7c94624670102938" + integrity sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + +gcp-metadata@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + dependencies: + gaxios "^6.0.0" + json-bigint "^1.0.0" + gensequence@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-6.0.0.tgz#ae46a0f89ebd7cc334e45cfb8f1c99a65248694e" @@ -12373,7 +13328,7 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.0: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== @@ -12524,6 +13479,16 @@ import-from@4.0.0, import-from@^4.0.0: resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== +import-in-the-middle@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" + integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw== + dependencies: + acorn "^8.8.2" + acorn-import-assertions "^1.9.0" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -13586,6 +14551,17 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== +joi@^17.3.0: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + js-cookie@^3.0.1: version "3.0.5" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" @@ -13638,6 +14614,13 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -15243,6 +16226,11 @@ module-deps@^6.2.3: through2 "^2.0.0" xtend "^4.0.0" +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + moment-timezone@^0.5.42: version "0.5.43" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.43.tgz#3dd7f3d0c67f78c23cd1906b9b2137a09b3c4790" @@ -15516,7 +16504,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.11, node-fetch@^2.6.7: +node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -16339,7 +17327,7 @@ object.values@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -obuf@^1.0.0, obuf@^1.1.2: +obuf@^1.0.0, obuf@^1.1.2, obuf@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== @@ -17004,6 +17992,45 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + +pg-protocol@*: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg-types@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.1.tgz#31857e89d00a6c66b06a14e907c3deec03889542" + integrity sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.0.1" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -17397,6 +18424,55 @@ postcss@8.4.31, postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-date@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.0.1.tgz#638b62e5c33764c292d37b08f5257ecb09231457" + integrity sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" + integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== + prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -17636,7 +18712,7 @@ protobufjs@^6.8.6: "@types/node" ">=13.7.0" long "^4.0.0" -protobufjs@^7.2.4: +protobufjs@^7.2.3, protobufjs@^7.2.4: version "7.2.5" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== @@ -18386,6 +19462,15 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-in-the-middle@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz#b539de8f00955444dc8aed95e17c69b0a4f10fcf" + integrity sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" @@ -18455,7 +19540,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@1.22.8, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: +resolve@1.22.8, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -18779,7 +19864,7 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.3, semver@^7.5.4: +semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -18928,6 +20013,11 @@ shell-quote@^1.4.2, shell-quote@^1.6.1, shell-quote@^1.7.2, shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +shimmer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"