diff --git a/.ergomake/docker-compose.yml b/.ergomake/docker-compose.yml
new file mode 100644
index 0000000000000..f657ad711c30f
--- /dev/null
+++ b/.ergomake/docker-compose.yml
@@ -0,0 +1,36 @@
+version: "3.9"
+services:
+ front:
+ build:
+ context: ..
+ dockerfile: ./infra/prod/front/Dockerfile
+ args:
+ REACT_APP_SERVER_BASE_URL: "http://localhost:3000"
+ ports:
+ - "3001:3000"
+ labels:
+ dev.ergomake.env.replace-arg.REACT_APP_SERVER_BASE_URL: "https://{{ services.server.url }}"
+ server:
+ build:
+ context: ..
+ dockerfile: ./infra/prod/server/Dockerfile
+ command: sh -c "yarn prisma migrate reset --force && node dist/src/main"
+ ports:
+ - "3000:3000"
+ environment:
+ DEBUG_MODE: false
+ SIGN_IN_PREFILLED: true
+ ACCESS_TOKEN_SECRET: "secret_jwt"
+ LOGIN_TOKEN_SECRET: "secret_login_token"
+ REFRESH_TOKEN_SECRET: "secret_refresh_token"
+ PG_DATABASE_URL: "postgres://postgres:postgrespassword@postgres:5432/default?connection_limit=1"
+ FRONT_BASE_URL: "http://localhost:3000"
+ labels:
+ dev.ergomake.env.replace-env.FRONT_BASE_URL: "https://{{ services.server.url }}"
+ postgres:
+ build: ../infra/dev/postgres
+ environment:
+ POSTGRES_PASSWORD: postgrespassword
+ ports:
+ - "5432"
+
diff --git a/.github/workflows/ci-chromatic.yaml b/.github/workflows/ci-chromatic.yaml
index fec4c44918e82..16cabdcaaac34 100644
--- a/.github/workflows/ci-chromatic.yaml
+++ b/.github/workflows/ci-chromatic.yaml
@@ -5,13 +5,13 @@ on:
branches:
- main
pull_request_target:
+ types: [labeled]
jobs:
chromatic-deployment:
+ if: ${{ contains(github.event.*.labels.*.name, 'run-chromatic') }} || github.event_name == 'push' }}
runs-on: ubuntu-latest
env:
- REACT_APP_API_URL: http://127.0.0.1:3000/graphql
- REACT_APP_AUTH_URL: http://127.0.0.1:3000/auth
- REACT_APP_FILES_URL: http://127.0.0.1:3000/files
+ REACT_APP_SERVER_BASE_URL: http://127.0.0.1:3000
steps:
- uses: actions/checkout@v3
if: github.event_name == 'push'
@@ -31,9 +31,7 @@ jobs:
run: |
cd front
touch .env
- echo "REACT_APP_API_URL: $REACT_APP_API_URL" >> .env
- echo "REACT_APP_AUTH_URL: $REACT_APP_AUTH_URL" >> .env
- echo "REACT_APP_FILES_URL: $REACT_APP_FILES_URL" >> .env
+ echo "REACT_APP_SERVER_BASE_URL: $REACT_APP_SERVER_BASE_URL" >> .env
- name: Front / Install Dependencies
run: cd front && yarn
- name: Publish to Chromatic
diff --git a/.github/workflows/ci-front.yaml b/.github/workflows/ci-front.yaml
index 76eb041fb886d..a5b149a5d817c 100644
--- a/.github/workflows/ci-front.yaml
+++ b/.github/workflows/ci-front.yaml
@@ -8,9 +8,7 @@ jobs:
front-test:
runs-on: ubuntu-latest
env:
- REACT_APP_API_URL: http://localhost:3000/graphql
- REACT_APP_AUTH_URL: http://localhost:3000/auth
- REACT_APP_FILES_URL: http://localhost:3000/files
+ REACT_APP_SERVER_BASE_URL: http://localhost:3000
steps:
- uses: actions/checkout@v3
if: github.event_name == 'push'
diff --git a/.github/workflows/ci-server.yaml b/.github/workflows/ci-server.yaml
index 82c24cac9a8e6..34a79899ee0a7 100644
--- a/.github/workflows/ci-server.yaml
+++ b/.github/workflows/ci-server.yaml
@@ -7,6 +7,21 @@ on:
jobs:
server-test:
runs-on: ubuntu-latest
+ services:
+ postgres:
+ image: postgres
+ env:
+ POSTGRES_HOST: postgres
+ POSTGRES_PASSWORD: postgrespassword
+ POSTGRES_DB: test
+ POSTGRES_PORT: 5432
+ ports:
+ - 5432:5432
+ options: >-
+ --health-cmd pg_isready
+ --health-interval 10s
+ --health-timeout 5s
+ --health-retries 5
steps:
- uses: actions/checkout@v3
if: github.event_name == 'push'
@@ -27,3 +42,6 @@ jobs:
- name: Server / Run jest tests
run: |
cd server && yarn test
+ - name: Server / Run e2e tests
+ run: |
+ cd server && yarn test:e2e
diff --git a/docs/docs/developer/local-setup.mdx b/docs/docs/developer/local-setup.mdx
index 4f4cf2ef669e8..5a096f42b995d 100644
--- a/docs/docs/developer/local-setup.mdx
+++ b/docs/docs/developer/local-setup.mdx
@@ -1,7 +1,7 @@
---
sidebar_position: 0
sidebar_custom_props:
- icon: TbArrowBigRight
+ icon: TbDeviceDesktop
---
# Local Setup
@@ -157,16 +157,14 @@ make server-prisma-reset
### 6. Start Twenty
-Run the project with the following commands:
+Run the project with the following commands from `root folder`:
-In `/front`:
```bash
-make front-start
+make server-start
```
-In `/server`:
```bash
-make server-start
+make front-start
```
You should now have:
diff --git a/docs/docs/hosting/self-hosting.mdx b/docs/docs/hosting/self-hosting.mdx
index cb15efdcb88e6..6b48e5adc2b76 100644
--- a/docs/docs/hosting/self-hosting.mdx
+++ b/docs/docs/hosting/self-hosting.mdx
@@ -19,9 +19,7 @@ You will find these in the [infra/prod/front/Dockerfile](https://github.com/twen
```bash
docker build \
- --build-arg REACT_APP_API_URL=REPLACE_ME \
- --build-arg REACT_APP_AUTH_URL=REPLACE_ME \
- --build-arg REACT_APP_FILES_URL=REPLACE_ME \
+ --build-arg REACT_APP_SERVER_BASE_URL=REPLACE_ME \
-t twenty-front:latest \
-f ./infra/prod/front/Dockerfile .
```
@@ -36,10 +34,19 @@ docker build \
-f ./infra/prod/server/Dockerfile .
```
+## Render
+
+[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/twentyhq/twenty)
+
+
## AWS Elastic Beanstalk (soon)
We are working on providing a joint Docker image - containing both the Twenty frontend and server - that you can deploy using [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/).
-## Railway (soon)
-[Railway](https://railway.app) is an infrastructure platform that lets you deploy to the cloud in one click. We are currently working on making it available.
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/docs/others/CLI.mdx b/docs/docs/others/CLI.mdx
index 0279037d64239..275e8024c8987 100644
--- a/docs/docs/others/CLI.mdx
+++ b/docs/docs/others/CLI.mdx
@@ -4,6 +4,6 @@ sidebar_custom_props:
icon: TbTerminal2
---
-# CLI (soon)
+# CLI
Available soon!
\ No newline at end of file
diff --git a/docs/src/theme/DocSidebarItem/Link/index.js b/docs/src/theme/DocSidebarItem/Link/index.js
index aaa820801cb23..5cc231aeed94c 100644
--- a/docs/src/theme/DocSidebarItem/Link/index.js
+++ b/docs/src/theme/DocSidebarItem/Link/index.js
@@ -6,7 +6,7 @@ import Link from '@docusaurus/Link';
import isInternalUrl from '@docusaurus/isInternalUrl';
import IconExternalLink from '@theme/Icon/ExternalLink';
import styles from './styles.module.css';
-import { TbFaceIdError, TbTerminal2, TbCloud, TbServer, TbBolt, TbApps, TbTopologyStar, TbChartDots, TbBug, TbVocabulary, TbArrowBigRight } from "react-icons/tb";
+import { TbFaceIdError, TbTerminal2, TbCloud, TbServer, TbBolt, TbApps, TbTopologyStar, TbChartDots, TbBug, TbVocabulary, TbArrowBigRight, TbDeviceDesktop } from "react-icons/tb";
export default function DocSidebarItemLink({
@@ -30,7 +30,8 @@ export default function DocSidebarItemLink({
'TbTopologyStar': TbTopologyStar,
'TbChartDots': TbChartDots,
'TbBug': TbBug,
- 'TbVocabulary': TbVocabulary
+ 'TbVocabulary': TbVocabulary,
+ 'TbDeviceDesktop': TbDeviceDesktop,
};
let IconComponent = customProps && customProps.icon ? icons[customProps.icon] : TbFaceIdError;
diff --git a/front/.env.example b/front/.env.example
index 33094934828b3..02a33b5371a22 100644
--- a/front/.env.example
+++ b/front/.env.example
@@ -1,5 +1,6 @@
-REACT_APP_API_URL=http://localhost:3000/graphql
-REACT_APP_AUTH_URL=http://localhost:3000/auth
-REACT_APP_FILES_URL=http://localhost:3000/files
+REACT_APP_SERVER_BASE_URL=http://localhost:3000
-CHROMATIC_PROJECT_TOKEN=REPLACE_ME
\ No newline at end of file
+# ———————— Optional ————————
+# REACT_APP_SERVER_AUTH_URL=http://localhost:3000/auth
+# REACT_APP_SERVER_FILES_URL=http://localhost:3000/files
+# CHROMATIC_PROJECT_TOKEN=
diff --git a/front/.nvmrc b/front/.nvmrc
index 807e541706b0c..3c79f30eca253 100644
--- a/front/.nvmrc
+++ b/front/.nvmrc
@@ -1 +1 @@
-18.6.0
\ No newline at end of file
+18.16.0
\ No newline at end of file
diff --git a/front/.storybook/preview.ts b/front/.storybook/preview.ts
index 70e33a8a66c2f..56edada6c0f66 100644
--- a/front/.storybook/preview.ts
+++ b/front/.storybook/preview.ts
@@ -2,7 +2,7 @@ import { initialize, mswDecorator } from 'msw-storybook-addon';
import { Preview } from '@storybook/react';
import { ThemeProvider } from '@emotion/react';
import { withThemeFromJSXProvider } from '@storybook/addon-styling';
-import { lightTheme, darkTheme } from '../src/modules/ui/themes/themes';
+import { lightTheme, darkTheme } from '../src/modules/ui/theme/constants/theme';
import { RootDecorator } from '../src/testing/decorators/RootDecorator';
import 'react-loading-skeleton/dist/skeleton.css';
import { mockedUserJWT } from '../src/testing/mock-data/jwt';
diff --git a/front/codegen.js b/front/codegen.js
index 3d41513711033..818affe05a6fb 100644
--- a/front/codegen.js
+++ b/front/codegen.js
@@ -1,5 +1,5 @@
module.exports = {
- schema: process.env.REACT_APP_API_URL,
+ schema: process.env.REACT_APP_SERVER_BASE_URL + "/graphql",
documents: ['./src/**/*.tsx', './src/**/*.ts'],
overwrite: true,
generates: {
diff --git a/front/package.json b/front/package.json
index 9f2d671f7ee96..7b17a8f2812c3 100644
--- a/front/package.json
+++ b/front/package.json
@@ -167,8 +167,8 @@
"workerDirectory": "public"
},
"nyc": {
- "statements": 70,
- "lines": 70,
+ "statements": 65,
+ "lines": 65,
"functions": 60,
"exclude": [
"src/generated/**/*"
diff --git a/front/src/App.tsx b/front/src/App.tsx
index aaeedffd77189..609aa1c41b6ae 100644
--- a/front/src/App.tsx
+++ b/front/src/App.tsx
@@ -5,9 +5,11 @@ import { SettingsPath } from '@/types/SettingsPath';
import { DefaultLayout } from '@/ui/layout/components/DefaultLayout';
import { CreateProfile } from '~/pages/auth/CreateProfile';
import { CreateWorkspace } from '~/pages/auth/CreateWorkspace';
+import { SignInUp } from '~/pages/auth/SignInUp';
import { Verify } from '~/pages/auth/Verify';
import { Companies } from '~/pages/companies/Companies';
import { CompanyShow } from '~/pages/companies/CompanyShow';
+import { Impersonate } from '~/pages/impersonate/Impersonate';
import { Opportunities } from '~/pages/opportunities/Opportunities';
import { People } from '~/pages/people/People';
import { PersonShow } from '~/pages/people/PersonShow';
@@ -15,9 +17,11 @@ import { SettingsExperience } from '~/pages/settings/SettingsExperience';
import { SettingsProfile } from '~/pages/settings/SettingsProfile';
import { SettingsWorksapce } from '~/pages/settings/SettingsWorkspace';
import { SettingsWorkspaceMembers } from '~/pages/settings/SettingsWorkspaceMembers';
+import { Tasks } from '~/pages/tasks/Tasks';
import { AppInternalHooks } from '~/sync-hooks/AppInternalHooks';
-import { SignInUp } from './pages/auth/SignInUp';
+// TEMP FEATURE FLAG FOR VIEW FIELDS
+export const ACTIVATE_VIEW_FIELDS = true;
export function App() {
return (
@@ -36,6 +40,8 @@ export function App() {
} />
} />
} />
+ } />
+ } />
} />
+ }
+ />
+
+
>;
+ assignee?: Maybe;
+ assigneeId?: Maybe;
+ attachments?: Maybe>;
+ author: User;
+ authorId: Scalars['String'];
+ body?: Maybe;
+ comments?: Maybe>;
+ completedAt?: Maybe;
+ createdAt: Scalars['DateTime'];
+ dueAt?: Maybe;
+ id: Scalars['ID'];
+ reminderAt?: Maybe;
+ title?: Maybe;
+ type: ActivityType;
+ updatedAt: Scalars['DateTime'];
+};
+
+export type ActivityCreateInput = {
+ activityTargets?: InputMaybe;
+ assignee?: InputMaybe;
+ attachments?: InputMaybe;
+ author: UserCreateNestedOneWithoutAuthoredActivitiesInput;
+ body?: InputMaybe;
+ comments?: InputMaybe;
+ completedAt?: InputMaybe;
+ createdAt?: InputMaybe;
+ dueAt?: InputMaybe;
+ id?: InputMaybe;
+ reminderAt?: InputMaybe;
+ title?: InputMaybe;
+ type?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityCreateNestedOneWithoutActivityTargetsInput = {
+ connect?: InputMaybe;
+};
+
+export type ActivityCreateNestedOneWithoutCommentsInput = {
+ connect?: InputMaybe;
+};
+
+export type ActivityListRelationFilter = {
+ every?: InputMaybe;
+ none?: InputMaybe;
+ some?: InputMaybe;
+};
+
+export type ActivityOrderByRelationAggregateInput = {
+ _count?: InputMaybe;
+};
+
+export type ActivityOrderByWithRelationInput = {
+ activityTargets?: InputMaybe;
+ assignee?: InputMaybe;
+ assigneeId?: InputMaybe;
+ attachments?: InputMaybe;
+ author?: InputMaybe;
+ authorId?: InputMaybe;
+ body?: InputMaybe;
+ comments?: InputMaybe;
+ completedAt?: InputMaybe;
+ createdAt?: InputMaybe;
+ dueAt?: InputMaybe;
+ id?: InputMaybe;
+ reminderAt?: InputMaybe;
+ title?: InputMaybe;
+ type?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityRelationFilter = {
+ is?: InputMaybe;
+ isNot?: InputMaybe;
+};
+
+export enum ActivityScalarFieldEnum {
+ AssigneeId = 'assigneeId',
+ AuthorId = 'authorId',
+ Body = 'body',
+ CompletedAt = 'completedAt',
+ CreatedAt = 'createdAt',
+ DeletedAt = 'deletedAt',
+ DueAt = 'dueAt',
+ Id = 'id',
+ ReminderAt = 'reminderAt',
+ Title = 'title',
+ Type = 'type',
+ UpdatedAt = 'updatedAt',
+ WorkspaceId = 'workspaceId'
+}
+
+export type ActivityTarget = {
+ __typename?: 'ActivityTarget';
+ activity: Activity;
+ activityId: Scalars['String'];
+ commentableId?: Maybe;
+ commentableType?: Maybe;
+ company?: Maybe;
+ companyId?: Maybe;
+ createdAt: Scalars['DateTime'];
+ id: Scalars['ID'];
+ person?: Maybe;
+ personId?: Maybe;
+ updatedAt: Scalars['DateTime'];
+};
+
+export type ActivityTargetCreateManyActivityInput = {
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ companyId?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ personId?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyActivityInputEnvelope = {
+ data: Array;
+ skipDuplicates?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyCompanyInput = {
+ activityId: Scalars['String'];
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ personId?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyCompanyInputEnvelope = {
+ data: Array;
+ skipDuplicates?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyPersonInput = {
+ activityId: Scalars['String'];
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ companyId?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyPersonInputEnvelope = {
+ data: Array;
+ skipDuplicates?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyWorkspaceInput = {
+ activityId: Scalars['String'];
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ companyId?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ personId?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateManyWorkspaceInputEnvelope = {
+ data: Array;
+ skipDuplicates?: InputMaybe;
+};
+
+export type ActivityTargetCreateNestedManyWithoutActivityInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+};
+
+export type ActivityTargetCreateNestedManyWithoutCompanyInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+};
+
+export type ActivityTargetCreateNestedManyWithoutPersonInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+};
+
+export type ActivityTargetCreateOrConnectWithoutActivityInput = {
+ create: ActivityTargetCreateWithoutActivityInput;
+ where: ActivityTargetWhereUniqueInput;
+};
+
+export type ActivityTargetCreateOrConnectWithoutCompanyInput = {
+ create: ActivityTargetCreateWithoutCompanyInput;
+ where: ActivityTargetWhereUniqueInput;
+};
+
+export type ActivityTargetCreateOrConnectWithoutPersonInput = {
+ create: ActivityTargetCreateWithoutPersonInput;
+ where: ActivityTargetWhereUniqueInput;
+};
+
+export type ActivityTargetCreateOrConnectWithoutWorkspaceInput = {
+ create: ActivityTargetCreateWithoutWorkspaceInput;
+ where: ActivityTargetWhereUniqueInput;
+};
+
+export type ActivityTargetCreateWithoutActivityInput = {
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ company?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ person?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateWithoutCompanyInput = {
+ activity: ActivityCreateNestedOneWithoutActivityTargetsInput;
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ person?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateWithoutPersonInput = {
+ activity: ActivityCreateNestedOneWithoutActivityTargetsInput;
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ company?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetCreateWithoutWorkspaceInput = {
+ activity: ActivityCreateNestedOneWithoutActivityTargetsInput;
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ company?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ person?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetListRelationFilter = {
+ every?: InputMaybe;
+ none?: InputMaybe;
+ some?: InputMaybe;
+};
+
+export type ActivityTargetOrderByRelationAggregateInput = {
+ _count?: InputMaybe;
+};
+
+export type ActivityTargetScalarWhereInput = {
+ AND?: InputMaybe>;
+ NOT?: InputMaybe>;
+ OR?: InputMaybe>;
+ activityId?: InputMaybe;
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ companyId?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ personId?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetUpdateManyWithoutActivityNestedInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+ delete?: InputMaybe>;
+ deleteMany?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityTargetUpdateManyWithoutCompanyNestedInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+ delete?: InputMaybe>;
+ deleteMany?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityTargetUpdateManyWithoutPersonNestedInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+ delete?: InputMaybe>;
+ deleteMany?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityTargetUpdateManyWithoutWorkspaceNestedInput = {
+ connect?: InputMaybe>;
+ connectOrCreate?: InputMaybe>;
+ create?: InputMaybe>;
+ createMany?: InputMaybe;
+ delete?: InputMaybe>;
+ deleteMany?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityTargetWhereInput = {
+ AND?: InputMaybe>;
+ NOT?: InputMaybe>;
+ OR?: InputMaybe>;
+ activity?: InputMaybe;
+ activityId?: InputMaybe;
+ commentableId?: InputMaybe;
+ commentableType?: InputMaybe;
+ company?: InputMaybe;
+ companyId?: InputMaybe;
+ createdAt?: InputMaybe;
+ id?: InputMaybe;
+ person?: InputMaybe;
+ personId?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityTargetWhereUniqueInput = {
+ id?: InputMaybe;
+};
+
export enum ActivityType {
Note = 'Note',
Task = 'Task'
}
+export type ActivityUpdateInput = {
+ activityTargets?: InputMaybe;
+ assignee?: InputMaybe;
+ attachments?: InputMaybe;
+ author?: InputMaybe;
+ body?: InputMaybe;
+ comments?: InputMaybe;
+ completedAt?: InputMaybe;
+ createdAt?: InputMaybe;
+ dueAt?: InputMaybe;
+ id?: InputMaybe;
+ reminderAt?: InputMaybe;
+ title?: InputMaybe;
+ type?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityUpdateManyWithoutAssigneeNestedInput = {
+ connect?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityUpdateManyWithoutAuthorNestedInput = {
+ connect?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityUpdateManyWithoutWorkspaceNestedInput = {
+ connect?: InputMaybe>;
+ disconnect?: InputMaybe>;
+ set?: InputMaybe>;
+};
+
+export type ActivityWhereInput = {
+ AND?: InputMaybe>;
+ NOT?: InputMaybe>;
+ OR?: InputMaybe>;
+ activityTargets?: InputMaybe;
+ assignee?: InputMaybe;
+ assigneeId?: InputMaybe;
+ attachments?: InputMaybe;
+ author?: InputMaybe;
+ authorId?: InputMaybe;
+ body?: InputMaybe;
+ comments?: InputMaybe;
+ completedAt?: InputMaybe;
+ createdAt?: InputMaybe;
+ dueAt?: InputMaybe;
+ id?: InputMaybe;
+ reminderAt?: InputMaybe;
+ title?: InputMaybe;
+ type?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type ActivityWhereUniqueInput = {
+ id?: InputMaybe;
+};
+
export type AffectedRows = {
__typename?: 'AffectedRows';
count: Scalars['Int'];
@@ -36,7 +439,7 @@ export type Analytics = {
export type Attachment = {
__typename?: 'Attachment';
- activity: CommentThread;
+ activity: Activity;
activityId: Scalars['String'];
author: User;
authorId: Scalars['String'];
@@ -95,7 +498,7 @@ export type AttachmentWhereInput = {
AND?: InputMaybe>;
NOT?: InputMaybe>;
OR?: InputMaybe>;
- activity?: InputMaybe;
+ activity?: InputMaybe;
activityId?: InputMaybe;
author?: InputMaybe;
authorId?: InputMaybe;
@@ -144,7 +547,7 @@ export type ClientConfig = {
__typename?: 'ClientConfig';
authProviders: AuthProviders;
debugMode: Scalars['Boolean'];
- demoMode: Scalars['Boolean'];
+ signInPrefilled: Scalars['Boolean'];
telemetry: Telemetry;
};
@@ -156,26 +559,28 @@ export enum ColorScheme {
export type Comment = {
__typename?: 'Comment';
+ activity?: Maybe;
+ activityId?: Maybe;
author: User;
authorId: Scalars['String'];
body: Scalars['String'];
- commentThread: CommentThread;
- commentThreadId: Scalars['String'];
+ commentThreadId?: Maybe;
createdAt: Scalars['DateTime'];
id: Scalars['ID'];
updatedAt: Scalars['DateTime'];
};
export type CommentCreateInput = {
+ activity?: InputMaybe;
author: UserCreateNestedOneWithoutCommentsInput;
body: Scalars['String'];
- commentThread: CommentThreadCreateNestedOneWithoutCommentsInput;
+ commentThreadId?: InputMaybe;
createdAt?: InputMaybe;
id?: InputMaybe;
updatedAt?: InputMaybe;
};
-export type CommentCreateNestedManyWithoutCommentThreadInput = {
+export type CommentCreateNestedManyWithoutActivityInput = {
connect?: InputMaybe>;
};
@@ -485,7 +890,7 @@ export type CommentUpdateManyWithoutAuthorNestedInput = {
set?: InputMaybe>;
};
-export type CommentUpdateManyWithoutCommentThreadNestedInput = {
+export type CommentUpdateManyWithoutAuthorNestedInput = {
connect?: InputMaybe>;
disconnect?: InputMaybe>;
set?: InputMaybe>;
@@ -501,11 +906,12 @@ export type CommentWhereInput = {
AND?: InputMaybe>;
NOT?: InputMaybe>;
OR?: InputMaybe>;
+ activity?: InputMaybe