diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
index 10ab982ff999..8897ad01ab38 100644
--- a/.github/CODE_OF_CONDUCT.md
+++ b/.github/CODE_OF_CONDUCT.md
@@ -2,7 +2,7 @@
## Twenty's Pledge
-The contributors and maintainers of this project pledge to ensure a harassment-free experience for everyone in the community. This commitment applies to individuals of all backgrounds, including age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity, experience, education, socio-economic status, nationality, appearance, race, religion. It also applies to individuals of all sexual identities and orientations.
+The contributors and maintainers of this project pledge to ensure a harassment-free experience for everyone in the community.
The focus of both contributors and maintainers is on acting and interacting in ways that promote an open, welcoming, friendly, diverse, inclusive, and healthy community.
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 8a57d7b34744..bbaa50483fc9 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,47 +1,38 @@
# Contributing to Twenty
+Thanks for considering contributing to Twenty!
-Thank you for considering contributing to Twenty! All community contributions are welcome.
-
-This guide outlines the process for contributing to this project. Please make sure to go through the [documentation](https://docs.twenty.com) before making your contribution.
-
-
-> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation:
-> - Star the project
-> - Tweet about it
-
+Please make sure to go through the [documentation](https://docs.twenty.com) before.
-## Getting Started
-
-Good first issues are a great way to start contributing to the project and get familiar with the codebase. Here's how to find them:
-
-1. Visit the "[Issues](https://github.com/twentyhq/twenty/issues)" tab on the main [repository](https://github.com/twentyhq/twenty).
-2. Use the "Labels" filter and select "[Good First Issue](https://github.com/twentyhq/twenty/labels/good%20first%20issue)" to see a list of beginner-friendly tasks.
-3. Choose an issue that interests you, fork the project, and start working on it. Once you solve and test the issue, open a PR for review.
+## Good first issues
-Note: We are aware that having multiple contributors address the same issue can cause frustration. To prevent this, we adhere to a specific guideline: if a core team member has assigned an issue to a contributor, either as the issue assignee or through explicit assignment in the issue comments within the past three days, that contributor's pull request takes precedence. Otherwise, the first PR submitted will be given priority. This delay is reduced to one day for PR tagged with "size: minutes" and extended to a week for PR tagged "size: days".
+Good first issues are a great way to start contributing and get familiar with the codebase. You can find them on by filtering on the [good first issue](https://github.com/twentyhq/twenty/labels/good%20first%20issue) label.
-Therefore, ensure you are assigned to an issue before beginning work on it.
+## Issue assignment
-
+Having multiple contributors address the same issue can cause frustration.
+To avoid conflicts, we follow these guidelines:
+1. If a core team member assigned you the issue within the last three days, your PR takes priority.
+2. Otherwise, the first submitted PR is prioritized.
+3. For "size: long" PRs, the assignment period extends to one week.
-## Contributing Guidelines
+Please ensure you're assigned to an issue before starting work.
+## How to Contribute
1. **Fork the Repository:** Click on the 'Fork' button in the upper right corner of the repository's GitHub page. This will create a copy of the repository in your GitHub account.
-
2. **Clone the Repository:** Clone your forked repository to your local machine using `git clone`.
-
```shell
git clone https://github.com/yourusername/twenty.git
cd twenty
```
+
3. **Create a New Branch:** Create a new branch for your changes instead of using the main branch.
```shell
@@ -56,40 +47,24 @@ git checkout -b your-branch-name
6. **Commit Changes:** Commit your changes with a clear and concise commit message.
-
```shell
git commit -m "Add your detailed description here"
```
-7. **Push Changes:** Push your changes to your forked repository.
+7. **Push Changes:** Push your changes to your forked repository.
```shell
git push origin your-branch-name
```
+8. **Create a Pull Request:** Go to the original Twenty repository and create a pull request. Please provide a detailed description of your changes. Submitting a PR means you agree to the CLA.
-8. **Create a Pull Request:** Go to the original Twenty repository and create a pull request. Please provide a detailed description of your changes. To have your pull request accepted, you must sign a CLA.
-
-
-9. **Code Review:** Your pull request will undergo a code review. Note that you might need to make any necessary adjustments based on feedback.
-
+9. **Code Review:** Your pull request will undergo a code review.
10. **Merge:** Once approved, maintainers will merge your pull request into the main repository.
-
-
-## Code of Conduct
-
-Please note that by contributing to this project, you're expected to follow Twenty's [Code of Conduct](./CODE_OF_CONDUCT.md). All maintainers strive to maintain a welcoming, friendly, and inclusive community for all contributors.
-
-
## Reporting Issues
-If you encounter any issues or have suggestions for improvements, please feel free to (create an issue on Twenty's GitHub repository)[https://github.com/twentyhq/twenty/issues/new]. When reporting issues, please provide as much detail as possible to help in understanding and addressing the problem effectively.
-
----
-
-Thank you for considering contributing to Twenty. Your contributions help make Twenty's CRM platform even better!
-
+If you face any issues or have suggestions, please feel free to (create an issue on Twenty's GitHub repository)[https://github.com/twentyhq/twenty/issues/new]. Please provide as much detail as possible.
\ No newline at end of file
diff --git a/.github/workflows/ci-server.yaml b/.github/workflows/ci-server.yaml
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/.gitignore b/.gitignore
index febe678d4530..11f7c37e5683 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,5 +26,7 @@ dist
storybook-static
*.tsbuildinfo
.eslintcache
+.cache
.nyc_output
-test-results/
\ No newline at end of file
+test-results/
+dump.rdb
diff --git a/.vscode/twenty.code-workspace b/.vscode/twenty.code-workspace
index 41549b6f9d6e..ce2498959c8e 100644
--- a/.vscode/twenty.code-workspace
+++ b/.vscode/twenty.code-workspace
@@ -20,6 +20,10 @@
"name": "packages/twenty-ui",
"path": "../packages/twenty-ui"
},
+ {
+ "name": "packages/twenty-emails",
+ "path": "../packages/twenty-emails"
+ },
{
"name": "packages/twenty-postgres",
"path": "../packages/twenty-postgres"
diff --git a/README.md b/README.md
index d46caec8d4f9..f0c96b0a32ac 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,7 @@ We felt the need for a CRM platform that empowers rather than constrains. We bel
# Demo
Go to demo.twenty.com and login with the following credentials:
+
```
email: noah@demo.dev
password: Applecar2025
@@ -67,6 +68,7 @@ Below are some features we have implemented to date:
+ [Create tasks on records](#create-tasks-on-records)
+ [Navigate quickly through the app using keyboard shortcuts and search](#navigate-quickly-through-the-app-using-keyboard-shortcuts-and-search)
+
## Add, filter, sort, edit, and track customers:
diff --git a/install.sh b/install.sh
index 2b7a2d46ee9b..39eb096b8e25 100755
--- a/install.sh
+++ b/install.sh
@@ -112,8 +112,10 @@ if command -v nc &> /dev/null; then
read -p "Enter a new port number: " new_port
if [[ $(uname) == "Darwin" ]]; then
sed -i '' "s/$port:$port/$new_port:$port/g" docker-compose.yml
+ sed -E -i '' "s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost:$new_port|g" .env
else
sed -i'' "s/$port:$port/$new_port:$port/g" docker-compose.yml
+ sed -E -i'' "s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost:$new_port|g" .env
fi
port=$new_port
done
diff --git a/package.json b/package.json
index 3fa3c5449f44..7b24d7ca5668 100644
--- a/package.json
+++ b/package.json
@@ -8,8 +8,6 @@
"@aws-sdk/credential-providers": "^3.363.0",
"@blocknote/mantine": "^0.15.3",
"@blocknote/react": "^0.15.3",
- "@chakra-ui/accordion": "^2.3.0",
- "@chakra-ui/system": "^2.6.0",
"@codesandbox/sandpack-react": "^2.13.5",
"@dagrejs/dagre": "^1.1.2",
"@docusaurus/core": "^3.1.0",
@@ -48,10 +46,9 @@
"@ptc-org/nestjs-query-typeorm": "4.2.1-alpha.2",
"@react-email/components": "0.0.12",
"@react-email/render": "0.0.10",
- "@sentry/node": "^7.99.0",
- "@sentry/profiling-node": "^1.3.4",
- "@sentry/react": "^7.88.0",
- "@sentry/tracing": "^7.99.0",
+ "@sentry/node": "^8",
+ "@sentry/profiling-node": "^8",
+ "@sentry/react": "^8",
"@sniptt/guards": "^0.2.0",
"@stoplight/elements": "^8.0.5",
"@swc/jest": "^0.2.29",
@@ -94,7 +91,6 @@
"facepaint": "^1.2.1",
"file-type": "16.5.4",
"framer-motion": "^10.12.17",
- "fs-extra": "^11.2.0",
"googleapis": "105",
"graphiql": "^3.1.1",
"graphql": "16.8.0",
@@ -277,6 +273,7 @@
"@types/node": "18.19.26",
"@types/passport-google-oauth20": "^2.0.11",
"@types/passport-jwt": "^3.0.8",
+ "@types/pluralize": "^0.0.33",
"@types/react": "^18.2.39",
"@types/react-datepicker": "^6.2.0",
"@types/react-dom": "^18.2.15",
diff --git a/packages/twenty-chrome-extension/src/generated/graphql.tsx b/packages/twenty-chrome-extension/src/generated/graphql.tsx
index 27d954014743..8b388aebc971 100644
--- a/packages/twenty-chrome-extension/src/generated/graphql.tsx
+++ b/packages/twenty-chrome-extension/src/generated/graphql.tsx
@@ -2527,6 +2527,7 @@ export enum FieldMetadataType {
Number = 'NUMBER',
Numeric = 'NUMERIC',
Phone = 'PHONE',
+ Phones = 'PHONES',
Position = 'POSITION',
Rating = 'RATING',
RawJson = 'RAW_JSON',
diff --git a/packages/twenty-docker/.env.example b/packages/twenty-docker/.env.example
index d7ab15672a9b..59d8d03f93a7 100644
--- a/packages/twenty-docker/.env.example
+++ b/packages/twenty-docker/.env.example
@@ -5,8 +5,8 @@ TAG=latest
PG_DATABASE_HOST=db:5432
SERVER_URL=http://localhost:3000
-# Uncoment if you are serving your front on another server than the API (eg. bucket)
-# FRONT_BASE_URL=http://localhost:3000
+# REDIS_HOST=redis
+# REDIS_PORT=6379
# Use openssl rand -base64 32 for each secret
# ACCESS_TOKEN_SECRET=replace_me_with_a_random_string_access
@@ -21,5 +21,3 @@ STORAGE_TYPE=local
# STORAGE_S3_REGION=eu-west3
# STORAGE_S3_NAME=my-bucket
# STORAGE_S3_ENDPOINT=
-
-MESSAGE_QUEUE_TYPE=pg-boss
diff --git a/packages/twenty-docker/docker-compose.yml b/packages/twenty-docker/docker-compose.yml
index 73cfc46de61c..7a2c28873d89 100644
--- a/packages/twenty-docker/docker-compose.yml
+++ b/packages/twenty-docker/docker-compose.yml
@@ -64,8 +64,8 @@ services:
NODE_ENV: ${NODE_ENV}
PG_DATABASE_URL: postgres://twenty:${POSTGRES_ADMIN_PASSWORD}@${PG_DATABASE_HOST}/default
PORT: 3000
- REDIS_HOST: redis
- REDIS_PORT: 6379
+ REDIS_PORT: ${REDIS_PORT:-6379}
+ REDIS_HOST: ${REDIS_HOST:-redis}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
REFRESH_TOKEN_EXPIRES_IN: ${REFRESH_TOKEN_EXPIRES_IN}
SENTRY_DSN: ${SENTRY_DSN}
@@ -135,8 +135,8 @@ services:
MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED}
NODE_ENV: ${NODE_ENV}
PG_DATABASE_URL: postgres://twenty:${POSTGRES_ADMIN_PASSWORD}@${PG_DATABASE_HOST}/default
- REDIS_HOST: redis
- REDIS_PORT: 6379
+ REDIS_PORT: ${REDIS_PORT:-6379}
+ REDIS_HOST: ${REDIS_HOST:-redis}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
REFRESH_TOKEN_EXPIRES_IN: ${REFRESH_TOKEN_EXPIRES_IN}
SENTRY_DSN: ${SENTRY_DSN}
diff --git a/packages/twenty-docker/twenty/Dockerfile b/packages/twenty-docker/twenty/Dockerfile
index ee0b05215b77..e57cf30d1469 100644
--- a/packages/twenty-docker/twenty/Dockerfile
+++ b/packages/twenty-docker/twenty/Dockerfile
@@ -50,6 +50,8 @@ FROM node:18.17.1-alpine as twenty
# Used to run healthcheck in docker
RUN apk add --no-cache curl jq
+RUN npm install -g tsx
+
COPY ./packages/twenty-docker/twenty/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
diff --git a/packages/twenty-docker/twenty/entrypoint.sh b/packages/twenty-docker/twenty/entrypoint.sh
index 17adc89521ab..9733781fd5e1 100755
--- a/packages/twenty-docker/twenty/entrypoint.sh
+++ b/packages/twenty-docker/twenty/entrypoint.sh
@@ -5,7 +5,7 @@ if [ "${ENABLE_DB_MIGRATIONS}" = "true" ] && [ ! -f /app/docker-data/db_status ]
echo "Running database setup and migrations..."
# Run setup and migration scripts
- NODE_OPTIONS="--max-old-space-size=1500" npx ts-node ./scripts/setup-db.ts
+ NODE_OPTIONS="--max-old-space-size=1500" tsx ./scripts/setup-db.ts
yarn database:migrate:prod
# Mark initialization as done
diff --git a/packages/twenty-emails/package.json b/packages/twenty-emails/package.json
index 8e0785846bce..dc0b89328e3c 100644
--- a/packages/twenty-emails/package.json
+++ b/packages/twenty-emails/package.json
@@ -1,6 +1,6 @@
{
"name": "twenty-emails",
- "version": "0.24.0",
+ "version": "0.30.0",
"description": "",
"author": "",
"private": true,
diff --git a/packages/twenty-emails/src/emails/workflow-action.email.tsx b/packages/twenty-emails/src/emails/workflow-action.email.tsx
new file mode 100644
index 000000000000..2eaa3a451ebb
--- /dev/null
+++ b/packages/twenty-emails/src/emails/workflow-action.email.tsx
@@ -0,0 +1,29 @@
+import { BaseEmail } from 'src/components/BaseEmail';
+import { Title } from 'src/components/Title';
+import { CallToAction } from 'src/components/CallToAction';
+
+type WorkflowActionEmailProps = {
+ dangerousHTML?: string;
+ title?: string;
+ callToAction?: {
+ value: string;
+ href: string;
+ };
+};
+export const WorkflowActionEmail = ({
+ dangerousHTML,
+ title,
+ callToAction,
+}: WorkflowActionEmailProps) => {
+ return (
+
+ {title && }
+ {dangerousHTML && (
+
+ )}
+ {callToAction && (
+
+ )}
+
+ );
+};
diff --git a/packages/twenty-emails/src/index.ts b/packages/twenty-emails/src/index.ts
index ddecb05c8655..9fca13d73b55 100644
--- a/packages/twenty-emails/src/index.ts
+++ b/packages/twenty-emails/src/index.ts
@@ -3,3 +3,4 @@ export * from './emails/delete-inactive-workspaces.email';
export * from './emails/password-reset-link.email';
export * from './emails/password-update-notify.email';
export * from './emails/send-invite-link.email';
+export * from './emails/workflow-action.email';
diff --git a/packages/twenty-front/.eslintrc.cjs b/packages/twenty-front/.eslintrc.cjs
index bb57531265be..df4daf7633a4 100644
--- a/packages/twenty-front/.eslintrc.cjs
+++ b/packages/twenty-front/.eslintrc.cjs
@@ -6,7 +6,6 @@ module.exports = {
'mockServiceWorker.js',
'**/generated*/*',
'**/generated/standard-metadata-query-result.ts',
- '**/getObjectMetadataItemsMock.ts',
'tsup.config.ts',
'build',
'coverage',
diff --git a/packages/twenty-front/.storybook/main.ts b/packages/twenty-front/.storybook/main.ts
index 3bd4d16b2a57..8b65348c4b69 100644
--- a/packages/twenty-front/.storybook/main.ts
+++ b/packages/twenty-front/.storybook/main.ts
@@ -51,9 +51,6 @@ const config: StorybookConfig = {
return mergeConfig(config, {
// Add dependencies to pre-optimization
- optimizeDeps: {
- exclude: ['@tabler/icons-react'],
- },
});
},
};
diff --git a/packages/twenty-front/jest.config.ts b/packages/twenty-front/jest.config.ts
index b9c8205189c7..c71df7b77aff 100644
--- a/packages/twenty-front/jest.config.ts
+++ b/packages/twenty-front/jest.config.ts
@@ -24,9 +24,9 @@ const jestConfig: JestConfigWithTsJest = {
extensionsToTreatAsEsm: ['.ts', '.tsx'],
coverageThreshold: {
global: {
- statements: 62,
- lines: 61,
- functions: 52,
+ statements: 60,
+ lines: 60,
+ functions: 50,
},
},
collectCoverageFrom: ['/src/**/*.ts'],
diff --git a/packages/twenty-front/package.json b/packages/twenty-front/package.json
index ed72dc01963c..e1a632247380 100644
--- a/packages/twenty-front/package.json
+++ b/packages/twenty-front/package.json
@@ -1,6 +1,6 @@
{
"name": "twenty-front",
- "version": "0.24.0",
+ "version": "0.30.0",
"private": true,
"type": "module",
"scripts": {
diff --git a/packages/twenty-front/public/images/placeholders/background/no_deleted_record_bg.png b/packages/twenty-front/public/images/placeholders/background/no_deleted_record_bg.png
new file mode 100644
index 000000000000..f69676ba7024
Binary files /dev/null and b/packages/twenty-front/public/images/placeholders/background/no_deleted_record_bg.png differ
diff --git a/packages/twenty-front/public/images/placeholders/dark-background/no_deleted_record_bg.png b/packages/twenty-front/public/images/placeholders/dark-background/no_deleted_record_bg.png
new file mode 100644
index 000000000000..3a7dd1cabf32
Binary files /dev/null and b/packages/twenty-front/public/images/placeholders/dark-background/no_deleted_record_bg.png differ
diff --git a/packages/twenty-front/public/images/placeholders/dark-background/no_match_record_bg.png b/packages/twenty-front/public/images/placeholders/dark-background/no_match_record_bg.png
index da554e159f2a..bb55a0b9c1df 100644
Binary files a/packages/twenty-front/public/images/placeholders/dark-background/no_match_record_bg.png and b/packages/twenty-front/public/images/placeholders/dark-background/no_match_record_bg.png differ
diff --git a/packages/twenty-front/public/images/placeholders/dark-moving-image/no_deleted_record.png b/packages/twenty-front/public/images/placeholders/dark-moving-image/no_deleted_record.png
new file mode 100644
index 000000000000..3e52331a1d80
Binary files /dev/null and b/packages/twenty-front/public/images/placeholders/dark-moving-image/no_deleted_record.png differ
diff --git a/packages/twenty-front/public/images/placeholders/moving-image/no_deleted_record.png b/packages/twenty-front/public/images/placeholders/moving-image/no_deleted_record.png
new file mode 100644
index 000000000000..9ee5863d4317
Binary files /dev/null and b/packages/twenty-front/public/images/placeholders/moving-image/no_deleted_record.png differ
diff --git a/packages/twenty-front/public/mockServiceWorker.js b/packages/twenty-front/public/mockServiceWorker.js
index e369128ec00c..15751fa1994f 100644
--- a/packages/twenty-front/public/mockServiceWorker.js
+++ b/packages/twenty-front/public/mockServiceWorker.js
@@ -2,13 +2,14 @@
/* tslint:disable */
/**
- * Mock Service Worker (2.0.11).
+ * Mock Service Worker.
* @see https://github.com/mswjs/msw
* - Please do NOT modify this file.
* - Please do NOT serve this file on production.
*/
-const INTEGRITY_CHECKSUM = 'c5f7f8e188b673ea4e677df7ea3c5a39'
+const PACKAGE_VERSION = '2.3.5'
+const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()
@@ -48,7 +49,10 @@ self.addEventListener('message', async function (event) {
case 'INTEGRITY_CHECK_REQUEST': {
sendToClient(client, {
type: 'INTEGRITY_CHECK_RESPONSE',
- payload: INTEGRITY_CHECKSUM,
+ payload: {
+ packageVersion: PACKAGE_VERSION,
+ checksum: INTEGRITY_CHECKSUM,
+ },
})
break
}
@@ -202,13 +206,6 @@ async function getResponse(event, client, requestId) {
return passthrough()
}
- // Bypass requests with the explicit bypass header.
- // Such requests can be issued by "ctx.fetch()".
- const mswIntention = request.headers.get('x-msw-intention')
- if (['bypass', 'passthrough'].includes(mswIntention)) {
- return passthrough()
- }
-
// Notify the client that a request has been intercepted.
const requestBuffer = await request.arrayBuffer()
const clientMessage = await sendToClient(
@@ -240,7 +237,7 @@ async function getResponse(event, client, requestId) {
return respondWithMock(clientMessage.data)
}
- case 'MOCK_NOT_FOUND': {
+ case 'PASSTHROUGH': {
return passthrough()
}
}
diff --git a/packages/twenty-front/setupTests.ts b/packages/twenty-front/setupTests.ts
index 8f2609b7b3e0..e5aa41c46c9f 100644
--- a/packages/twenty-front/setupTests.ts
+++ b/packages/twenty-front/setupTests.ts
@@ -3,3 +3,14 @@
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';
+
+/**
+ * The structuredClone global function is not available in jsdom, it needs to be mocked for now.
+ *
+ * The most naive way to mock structuredClone is to use JSON.stringify and JSON.parse. This works
+ * for arguments with simple types like primitives, arrays and objects, but doesn't work with functions,
+ * Map, Set, etc.
+ */
+global.structuredClone = (val) => {
+ return JSON.parse(JSON.stringify(val));
+};
diff --git a/packages/twenty-front/src/App.tsx b/packages/twenty-front/src/App.tsx
index 3b165129832e..1c6adcfdf60e 100644
--- a/packages/twenty-front/src/App.tsx
+++ b/packages/twenty-front/src/App.tsx
@@ -5,7 +5,6 @@ import {
Outlet,
Route,
RouterProvider,
- Routes,
useLocation,
} from 'react-router-dom';
import { useRecoilValue } from 'recoil';
@@ -24,7 +23,6 @@ import { ApolloMetadataClientProvider } from '@/object-metadata/components/Apoll
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
import { PrefetchDataProvider } from '@/prefetch/components/PrefetchDataProvider';
import { AppPath } from '@/types/AppPath';
-import { SettingsPath } from '@/types/SettingsPath';
import { DialogManager } from '@/ui/feedback/dialog-manager/components/DialogManager';
import { DialogManagerScope } from '@/ui/feedback/dialog-manager/scopes/DialogManagerScope';
import { SnackBarProvider } from '@/ui/feedback/snack-bar-manager/components/SnackBarProvider';
@@ -52,39 +50,7 @@ import { CreateWorkspace } from '~/pages/onboarding/CreateWorkspace';
import { InviteTeam } from '~/pages/onboarding/InviteTeam';
import { PaymentSuccess } from '~/pages/onboarding/PaymentSuccess';
import { SyncEmails } from '~/pages/onboarding/SyncEmails';
-import { SettingsAccounts } from '~/pages/settings/accounts/SettingsAccounts';
-import { SettingsAccountsCalendars } from '~/pages/settings/accounts/SettingsAccountsCalendars';
-import { SettingsAccountsEmails } from '~/pages/settings/accounts/SettingsAccountsEmails';
-import { SettingsNewAccount } from '~/pages/settings/accounts/SettingsNewAccount';
-import { SettingsCRMMigration } from '~/pages/settings/crm-migration/SettingsCRMMigration';
-import { SettingsNewObject } from '~/pages/settings/data-model/SettingsNewObject';
-import { SettingsObjectDetailPage } from '~/pages/settings/data-model/SettingsObjectDetailPage';
-import { SettingsObjectEdit } from '~/pages/settings/data-model/SettingsObjectEdit';
-import { SettingsObjectFieldEdit } from '~/pages/settings/data-model/SettingsObjectFieldEdit';
-import { SettingsObjectNewFieldStep1 } from '~/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep1';
-import { SettingsObjectNewFieldStep2 } from '~/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2';
-import { SettingsObjectOverview } from '~/pages/settings/data-model/SettingsObjectOverview';
-import { SettingsObjects } from '~/pages/settings/data-model/SettingsObjects';
-import { SettingsDevelopersApiKeyDetail } from '~/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail';
-import { SettingsDevelopersApiKeysNew } from '~/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew';
-import { SettingsDevelopers } from '~/pages/settings/developers/SettingsDevelopers';
-import { SettingsDevelopersWebhooksDetail } from '~/pages/settings/developers/webhooks/SettingsDevelopersWebhookDetail';
-import { SettingsDevelopersWebhooksNew } from '~/pages/settings/developers/webhooks/SettingsDevelopersWebhooksNew';
-import { SettingsIntegrationDatabase } from '~/pages/settings/integrations/SettingsIntegrationDatabase';
-import { SettingsIntegrationEditDatabaseConnection } from '~/pages/settings/integrations/SettingsIntegrationEditDatabaseConnection';
-import { SettingsIntegrationNewDatabaseConnection } from '~/pages/settings/integrations/SettingsIntegrationNewDatabaseConnection';
-import { SettingsIntegrations } from '~/pages/settings/integrations/SettingsIntegrations';
-import { SettingsIntegrationShowDatabaseConnection } from '~/pages/settings/integrations/SettingsIntegrationShowDatabaseConnection';
-import { SettingsAppearance } from '~/pages/settings/profile/appearance/components/SettingsAppearance';
-import { Releases } from '~/pages/settings/Releases';
-import { SettingsServerlessFunctionDetailWrapper } from '~/pages/settings/serverless-functions/SettingsServerlessFunctionDetailWrapper';
-import { SettingsServerlessFunctions } from '~/pages/settings/serverless-functions/SettingsServerlessFunctions';
-import { SettingsServerlessFunctionsNew } from '~/pages/settings/serverless-functions/SettingsServerlessFunctionsNew';
-import { SettingsBilling } from '~/pages/settings/SettingsBilling';
-import { SettingsProfile } from '~/pages/settings/SettingsProfile';
-import { SettingsWorkspace } from '~/pages/settings/SettingsWorkspace';
-import { SettingsWorkspaceMembers } from '~/pages/settings/SettingsWorkspaceMembers';
-import { WorkflowShowPage } from '~/pages/workflows/WorkflowShowPage';
+import { SettingsRoutes } from '~/SettingsRoutes';
import { getPageTitleFromPath } from '~/utils/title-utils';
const ProvidersThatNeedRouterContext = () => {
@@ -136,7 +102,6 @@ const createRouter = (
isBillingEnabled?: boolean,
isCRMMigrationEnabled?: boolean,
isServerlessFunctionSettingsEnabled?: boolean,
- isWorkflowEnabled?: boolean,
) =>
createBrowserRouter(
createRoutesFromElements(
@@ -164,159 +129,16 @@ const createRouter = (
} />
} />
} />
-
- {isWorkflowEnabled === true ? (
- }
- />
- ) : null}
-
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- {isBillingEnabled && (
- }
- />
- )}
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- {isCRMMigrationEnabled && (
- }
- />
- )}
-
- }
- />
- }
- />
- }
- />
- }
- />
-
- }
- />
- {isServerlessFunctionSettingsEnabled && (
- <>
- }
- />
- }
- />
- }
- />
- >
- )}
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- }
- />
- } />
-
+
}
/>
} />
@@ -335,7 +157,6 @@ export const App = () => {
const isServerlessFunctionSettingsEnabled = useIsFeatureEnabled(
'IS_FUNCTION_SETTINGS_ENABLED',
);
- const isWorkflowEnabled = useIsFeatureEnabled('IS_WORKFLOW_ENABLED');
const isBillingPageEnabled =
billing?.isBillingEnabled && !isFreeAccessEnabled;
@@ -346,7 +167,6 @@ export const App = () => {
isBillingPageEnabled,
isCRMMigrationEnabled,
isServerlessFunctionSettingsEnabled,
- isWorkflowEnabled,
)}
/>
);
diff --git a/packages/twenty-front/src/SettingsRoutes.tsx b/packages/twenty-front/src/SettingsRoutes.tsx
new file mode 100644
index 000000000000..05e852e2bed0
--- /dev/null
+++ b/packages/twenty-front/src/SettingsRoutes.tsx
@@ -0,0 +1,362 @@
+import { lazy, Suspense } from 'react';
+import { Route, Routes } from 'react-router-dom';
+
+import { AppPath } from '@/types/AppPath';
+import { SettingsPath } from '@/types/SettingsPath';
+
+const SettingsAccountsCalendars = lazy(() =>
+ import('~/pages/settings/accounts/SettingsAccountsCalendars').then(
+ (module) => ({
+ default: module.SettingsAccountsCalendars,
+ }),
+ ),
+);
+
+const SettingsAccountsEmails = lazy(() =>
+ import('~/pages/settings/accounts/SettingsAccountsEmails').then((module) => ({
+ default: module.SettingsAccountsEmails,
+ })),
+);
+
+const SettingsNewAccount = lazy(() =>
+ import('~/pages/settings/accounts/SettingsNewAccount').then((module) => ({
+ default: module.SettingsNewAccount,
+ })),
+);
+
+const SettingsNewObject = lazy(() =>
+ import('~/pages/settings/data-model/SettingsNewObject').then((module) => ({
+ default: module.SettingsNewObject,
+ })),
+);
+
+const SettingsObjectDetailPage = lazy(() =>
+ import('~/pages/settings/data-model/SettingsObjectDetailPage').then(
+ (module) => ({
+ default: module.SettingsObjectDetailPage,
+ }),
+ ),
+);
+
+const SettingsObjectOverview = lazy(() =>
+ import('~/pages/settings/data-model/SettingsObjectOverview').then(
+ (module) => ({
+ default: module.SettingsObjectOverview,
+ }),
+ ),
+);
+
+const SettingsDevelopersApiKeyDetail = lazy(() =>
+ import(
+ '~/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail'
+ ).then((module) => ({
+ default: module.SettingsDevelopersApiKeyDetail,
+ })),
+);
+
+const SettingsDevelopersApiKeysNew = lazy(() =>
+ import(
+ '~/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew'
+ ).then((module) => ({
+ default: module.SettingsDevelopersApiKeysNew,
+ })),
+);
+
+const SettingsDevelopersWebhooksNew = lazy(() =>
+ import(
+ '~/pages/settings/developers/webhooks/SettingsDevelopersWebhooksNew'
+ ).then((module) => ({
+ default: module.SettingsDevelopersWebhooksNew,
+ })),
+);
+
+const Releases = lazy(() =>
+ import('~/pages/settings/Releases').then((module) => ({
+ default: module.Releases,
+ })),
+);
+
+const SettingsServerlessFunctions = lazy(() =>
+ import(
+ '~/pages/settings/serverless-functions/SettingsServerlessFunctions'
+ ).then((module) => ({ default: module.SettingsServerlessFunctions })),
+);
+
+const SettingsServerlessFunctionDetailWrapper = lazy(() =>
+ import(
+ '~/pages/settings/serverless-functions/SettingsServerlessFunctionDetailWrapper'
+ ).then((module) => ({
+ default: module.SettingsServerlessFunctionDetailWrapper,
+ })),
+);
+
+const SettingsServerlessFunctionsNew = lazy(() =>
+ import(
+ '~/pages/settings/serverless-functions/SettingsServerlessFunctionsNew'
+ ).then((module) => ({
+ default: module.SettingsServerlessFunctionsNew,
+ })),
+);
+
+const SettingsWorkspace = lazy(() =>
+ import('~/pages/settings/SettingsWorkspace').then((module) => ({
+ default: module.SettingsWorkspace,
+ })),
+);
+
+const SettingsWorkspaceMembers = lazy(() =>
+ import('~/pages/settings/SettingsWorkspaceMembers').then((module) => ({
+ default: module.SettingsWorkspaceMembers,
+ })),
+);
+
+const SettingsProfile = lazy(() =>
+ import('~/pages/settings/SettingsProfile').then((module) => ({
+ default: module.SettingsProfile,
+ })),
+);
+
+const SettingsAppearance = lazy(() =>
+ import(
+ '~/pages/settings/profile/appearance/components/SettingsAppearance'
+ ).then((module) => ({
+ default: module.SettingsAppearance,
+ })),
+);
+
+const SettingsAccounts = lazy(() =>
+ import('~/pages/settings/accounts/SettingsAccounts').then((module) => ({
+ default: module.SettingsAccounts,
+ })),
+);
+
+const SettingsBilling = lazy(() =>
+ import('~/pages/settings/SettingsBilling').then((module) => ({
+ default: module.SettingsBilling,
+ })),
+);
+
+const SettingsDevelopers = lazy(() =>
+ import('~/pages/settings/developers/SettingsDevelopers').then((module) => ({
+ default: module.SettingsDevelopers,
+ })),
+);
+
+const SettingsObjectEdit = lazy(() =>
+ import('~/pages/settings/data-model/SettingsObjectEdit').then((module) => ({
+ default: module.SettingsObjectEdit,
+ })),
+);
+
+const SettingsIntegrations = lazy(() =>
+ import('~/pages/settings/integrations/SettingsIntegrations').then(
+ (module) => ({
+ default: module.SettingsIntegrations,
+ }),
+ ),
+);
+
+const SettingsObjects = lazy(() =>
+ import('~/pages/settings/data-model/SettingsObjects').then((module) => ({
+ default: module.SettingsObjects,
+ })),
+);
+
+const SettingsDevelopersWebhooksDetail = lazy(() =>
+ import(
+ '~/pages/settings/developers/webhooks/SettingsDevelopersWebhookDetail'
+ ).then((module) => ({
+ default: module.SettingsDevelopersWebhooksDetail,
+ })),
+);
+
+const SettingsIntegrationDatabase = lazy(() =>
+ import('~/pages/settings/integrations/SettingsIntegrationDatabase').then(
+ (module) => ({
+ default: module.SettingsIntegrationDatabase,
+ }),
+ ),
+);
+
+const SettingsIntegrationNewDatabaseConnection = lazy(() =>
+ import(
+ '~/pages/settings/integrations/SettingsIntegrationNewDatabaseConnection'
+ ).then((module) => ({
+ default: module.SettingsIntegrationNewDatabaseConnection,
+ })),
+);
+
+const SettingsIntegrationEditDatabaseConnection = lazy(() =>
+ import(
+ '~/pages/settings/integrations/SettingsIntegrationEditDatabaseConnection'
+ ).then((module) => ({
+ default: module.SettingsIntegrationEditDatabaseConnection,
+ })),
+);
+
+const SettingsIntegrationShowDatabaseConnection = lazy(() =>
+ import(
+ '~/pages/settings/integrations/SettingsIntegrationShowDatabaseConnection'
+ ).then((module) => ({
+ default: module.SettingsIntegrationShowDatabaseConnection,
+ })),
+);
+
+const SettingsObjectNewFieldStep1 = lazy(() =>
+ import(
+ '~/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep1'
+ ).then((module) => ({
+ default: module.SettingsObjectNewFieldStep1,
+ })),
+);
+
+const SettingsObjectNewFieldStep2 = lazy(() =>
+ import(
+ '~/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2'
+ ).then((module) => ({
+ default: module.SettingsObjectNewFieldStep2,
+ })),
+);
+
+const SettingsObjectFieldEdit = lazy(() =>
+ import('~/pages/settings/data-model/SettingsObjectFieldEdit').then(
+ (module) => ({
+ default: module.SettingsObjectFieldEdit,
+ }),
+ ),
+);
+
+const SettingsCRMMigration = lazy(() =>
+ import('~/pages/settings/crm-migration/SettingsCRMMigration').then(
+ (module) => ({
+ default: module.SettingsCRMMigration,
+ }),
+ ),
+);
+
+type SettingsRoutesProps = {
+ isBillingEnabled?: boolean;
+ isCRMMigrationEnabled?: boolean;
+ isServerlessFunctionSettingsEnabled?: boolean;
+};
+
+export const SettingsRoutes = ({
+ isBillingEnabled,
+ isCRMMigrationEnabled,
+ isServerlessFunctionSettingsEnabled,
+}: SettingsRoutesProps) => (
+
+
+ } />
+ } />
+ } />
+ } />
+ }
+ />
+ }
+ />
+ {isBillingEnabled && (
+ } />
+ )}
+ }
+ />
+ } />
+ } />
+ }
+ />
+ }
+ />
+ } />
+ } />
+ } />
+ {isCRMMigrationEnabled && (
+ }
+ />
+ )}
+
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+
+ }
+ />
+ {isServerlessFunctionSettingsEnabled && (
+ <>
+ }
+ />
+ }
+ />
+ }
+ />
+ >
+ )}
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ } />
+
+
+);
diff --git a/packages/twenty-front/src/effect-components/PageChangeEffect.tsx b/packages/twenty-front/src/effect-components/PageChangeEffect.tsx
index bf083a157e5a..05c99cc89d56 100644
--- a/packages/twenty-front/src/effect-components/PageChangeEffect.tsx
+++ b/packages/twenty-front/src/effect-components/PageChangeEffect.tsx
@@ -4,7 +4,10 @@ import { useRecoilValue } from 'recoil';
import { IconCheckbox } from 'twenty-ui';
import { useOpenCreateActivityDrawer } from '@/activities/hooks/useOpenCreateActivityDrawer';
-import { useEventTracker } from '@/analytics/hooks/useEventTracker';
+import {
+ setSessionId,
+ useEventTracker,
+} from '@/analytics/hooks/useEventTracker';
import { useRequestFreshCaptchaToken } from '@/captcha/hooks/useRequestFreshCaptchaToken';
import { isCaptchaScriptLoadedState } from '@/captcha/states/isCaptchaScriptLoadedState';
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
@@ -163,10 +166,14 @@ export const PageChangeEffect = () => {
useEffect(() => {
setTimeout(() => {
+ setSessionId();
eventTracker('pageview', {
- location: {
- pathname: location.pathname,
- },
+ pathname: location.pathname,
+ locale: navigator.language,
+ userAgent: window.navigator.userAgent,
+ href: window.location.href,
+ referrer: document.referrer,
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
});
}, 500);
}, [eventTracker, location.pathname]);
diff --git a/packages/twenty-front/src/generated-metadata/gql.ts b/packages/twenty-front/src/generated-metadata/gql.ts
index 4c43b04b58b2..2635b40c2b0f 100644
--- a/packages/twenty-front/src/generated-metadata/gql.ts
+++ b/packages/twenty-front/src/generated-metadata/gql.ts
@@ -32,13 +32,14 @@ const documents = {
"\n mutation DeleteOneObjectMetadataItem($idToDelete: UUID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.DeleteOneObjectMetadataItemDocument,
"\n mutation DeleteOneFieldMetadataItem($idToDelete: UUID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneFieldMetadataItemDocument,
"\n mutation DeleteOneRelationMetadataItem($idToDelete: UUID!) {\n deleteOneRelation(input: { id: $idToDelete }) {\n id\n }\n }\n": types.DeleteOneRelationMetadataItemDocument,
- "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n": types.ObjectMetadataItemsDocument,
+ "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n": types.ObjectMetadataItemsDocument,
"\n fragment ServerlessFunctionFields on ServerlessFunction {\n id\n name\n description\n sourceCodeHash\n runtime\n syncStatus\n latestVersion\n createdAt\n updatedAt\n }\n": types.ServerlessFunctionFieldsFragmentDoc,
"\n \n mutation CreateOneServerlessFunctionItem(\n $input: CreateServerlessFunctionInput!\n ) {\n createOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.CreateOneServerlessFunctionItemDocument,
"\n \n mutation DeleteOneServerlessFunction($input: DeleteServerlessFunctionInput!) {\n deleteOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.DeleteOneServerlessFunctionDocument,
"\n mutation ExecuteOneServerlessFunction(\n $input: ExecuteServerlessFunctionInput!\n ) {\n executeOneServerlessFunction(input: $input) {\n data\n duration\n status\n error\n }\n }\n": types.ExecuteOneServerlessFunctionDocument,
"\n \n mutation PublishOneServerlessFunction(\n $input: PublishServerlessFunctionInput!\n ) {\n publishServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.PublishOneServerlessFunctionDocument,
"\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.UpdateOneServerlessFunctionDocument,
+ "\n query FindManyAvailablePackages {\n getAvailablePackages\n }\n": types.FindManyAvailablePackagesDocument,
"\n \n query GetManyServerlessFunctions {\n serverlessFunctions(paging: { first: 100 }) {\n edges {\n node {\n ...ServerlessFunctionFields\n }\n }\n }\n }\n": types.GetManyServerlessFunctionsDocument,
"\n \n query GetOneServerlessFunction($id: UUID!) {\n serverlessFunction(id: $id) {\n ...ServerlessFunctionFields\n }\n }\n": types.GetOneServerlessFunctionDocument,
"\n query FindOneServerlessFunctionSourceCode(\n $input: GetServerlessFunctionSourceCodeInput!\n ) {\n getServerlessFunctionSourceCode(input: $input)\n }\n": types.FindOneServerlessFunctionSourceCodeDocument,
@@ -137,7 +138,7 @@ export function graphql(source: "\n mutation DeleteOneRelationMetadataItem($idT
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"];
+export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -162,6 +163,10 @@ export function graphql(source: "\n \n mutation PublishOneServerlessFunction(\
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"): (typeof documents)["\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\n query FindManyAvailablePackages {\n getAvailablePackages\n }\n"): (typeof documents)["\n query FindManyAvailablePackages {\n getAvailablePackages\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -176,7 +181,7 @@ export function graphql(source: "\n \n query GetOneServerlessFunction($id: UUI
export function graphql(source: "\n query FindOneServerlessFunctionSourceCode(\n $input: GetServerlessFunctionSourceCodeInput!\n ) {\n getServerlessFunctionSourceCode(input: $input)\n }\n"): (typeof documents)["\n query FindOneServerlessFunctionSourceCode(\n $input: GetServerlessFunctionSourceCodeInput!\n ) {\n getServerlessFunctionSourceCode(input: $input)\n }\n"];
export function graphql(source: string) {
- return (documents as any)[source] ?? {};
+ return (documents as any)[source] ?? {};
}
export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never;
\ No newline at end of file
diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts
index c02633c4c993..2c6e115bb521 100644
--- a/packages/twenty-front/src/generated-metadata/graphql.ts
+++ b/packages/twenty-front/src/generated-metadata/graphql.ts
@@ -9,1586 +9,1588 @@ export type MakeEmpty =
export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
- ID: { input: string; output: string; }
- String: { input: string; output: string; }
- Boolean: { input: boolean; output: boolean; }
- Int: { input: number; output: number; }
- Float: { input: number; output: number; }
- /** Cursor for paging through collections */
- ConnectionCursor: { input: any; output: any; }
- /** A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format. */
- DateTime: { input: any; output: any; }
- /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */
- JSON: { input: any; output: any; }
- /** The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */
- JSONObject: { input: any; output: any; }
- /** A UUID scalar type */
- UUID: { input: any; output: any; }
- /** The `Upload` scalar type represents a file upload. */
- Upload: { input: any; output: any; }
+ ID: { input: string; output: string; }
+ String: { input: string; output: string; }
+ Boolean: { input: boolean; output: boolean; }
+ Int: { input: number; output: number; }
+ Float: { input: number; output: number; }
+ /** Cursor for paging through collections */
+ ConnectionCursor: { input: any; output: any; }
+ /** A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format. */
+ DateTime: { input: any; output: any; }
+ /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */
+ JSON: { input: any; output: any; }
+ /** The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */
+ JSONObject: { input: any; output: any; }
+ /** A UUID scalar type */
+ UUID: { input: any; output: any; }
+ /** The `Upload` scalar type represents a file upload. */
+ Upload: { input: any; output: any; }
};
export type AisqlQueryResult = {
- __typename?: 'AISQLQueryResult';
- queryFailedErrorMessage?: Maybe;
- sqlQuery: Scalars['String']['output'];
- sqlQueryResult?: Maybe;
+ __typename?: 'AISQLQueryResult';
+ queryFailedErrorMessage?: Maybe;
+ sqlQuery: Scalars['String']['output'];
+ sqlQueryResult?: Maybe;
};
export type ActivateWorkspaceInput = {
- displayName?: InputMaybe;
+ displayName?: InputMaybe;
};
export type Analytics = {
- __typename?: 'Analytics';
- /** Boolean that confirms query was dispatched */
- success: Scalars['Boolean']['output'];
+ __typename?: 'Analytics';
+ /** Boolean that confirms query was dispatched */
+ success: Scalars['Boolean']['output'];
};
export type ApiConfig = {
- __typename?: 'ApiConfig';
- mutationMaximumAffectedRecords: Scalars['Float']['output'];
+ __typename?: 'ApiConfig';
+ mutationMaximumAffectedRecords: Scalars['Float']['output'];
};
export type ApiKeyToken = {
- __typename?: 'ApiKeyToken';
- token: Scalars['String']['output'];
+ __typename?: 'ApiKeyToken';
+ token: Scalars['String']['output'];
};
export type AppToken = {
- __typename?: 'AppToken';
- createdAt: Scalars['DateTime']['output'];
- expiresAt: Scalars['DateTime']['output'];
- id: Scalars['UUID']['output'];
- type: Scalars['String']['output'];
- updatedAt: Scalars['DateTime']['output'];
+ __typename?: 'AppToken';
+ createdAt: Scalars['DateTime']['output'];
+ expiresAt: Scalars['DateTime']['output'];
+ id: Scalars['UUID']['output'];
+ type: Scalars['String']['output'];
+ updatedAt: Scalars['DateTime']['output'];
};
export type AppTokenEdge = {
- __typename?: 'AppTokenEdge';
- /** Cursor for this node. */
- cursor: Scalars['ConnectionCursor']['output'];
- /** The node containing the AppToken */
- node: AppToken;
+ __typename?: 'AppTokenEdge';
+ /** Cursor for this node. */
+ cursor: Scalars['ConnectionCursor']['output'];
+ /** The node containing the AppToken */
+ node: AppToken;
};
export type AuthProviders = {
- __typename?: 'AuthProviders';
- google: Scalars['Boolean']['output'];
- magicLink: Scalars['Boolean']['output'];
- microsoft: Scalars['Boolean']['output'];
- password: Scalars['Boolean']['output'];
+ __typename?: 'AuthProviders';
+ google: Scalars['Boolean']['output'];
+ magicLink: Scalars['Boolean']['output'];
+ microsoft: Scalars['Boolean']['output'];
+ password: Scalars['Boolean']['output'];
};
export type AuthToken = {
- __typename?: 'AuthToken';
- expiresAt: Scalars['DateTime']['output'];
- token: Scalars['String']['output'];
+ __typename?: 'AuthToken';
+ expiresAt: Scalars['DateTime']['output'];
+ token: Scalars['String']['output'];
};
export type AuthTokenPair = {
- __typename?: 'AuthTokenPair';
- accessToken: AuthToken;
- refreshToken: AuthToken;
+ __typename?: 'AuthTokenPair';
+ accessToken: AuthToken;
+ refreshToken: AuthToken;
};
export type AuthTokens = {
- __typename?: 'AuthTokens';
- tokens: AuthTokenPair;
+ __typename?: 'AuthTokens';
+ tokens: AuthTokenPair;
};
export type AuthorizeApp = {
- __typename?: 'AuthorizeApp';
- redirectUrl: Scalars['String']['output'];
+ __typename?: 'AuthorizeApp';
+ redirectUrl: Scalars['String']['output'];
};
export type Billing = {
- __typename?: 'Billing';
- billingFreeTrialDurationInDays?: Maybe;
- billingUrl?: Maybe;
- isBillingEnabled: Scalars['Boolean']['output'];
+ __typename?: 'Billing';
+ billingFreeTrialDurationInDays?: Maybe;
+ billingUrl?: Maybe;
+ isBillingEnabled: Scalars['Boolean']['output'];
};
export type BillingSubscription = {
- __typename?: 'BillingSubscription';
- id: Scalars['UUID']['output'];
- interval?: Maybe;
- status: SubscriptionStatus;
+ __typename?: 'BillingSubscription';
+ id: Scalars['UUID']['output'];
+ interval?: Maybe;
+ status: SubscriptionStatus;
};
export type BillingSubscriptionFilter = {
- and?: InputMaybe>;
- id?: InputMaybe;
- or?: InputMaybe>;
+ and?: InputMaybe>;
+ id?: InputMaybe;
+ or?: InputMaybe>;
};
export type BillingSubscriptionSort = {
- direction: SortDirection;
- field: BillingSubscriptionSortFields;
- nulls?: InputMaybe;
+ direction: SortDirection;
+ field: BillingSubscriptionSortFields;
+ nulls?: InputMaybe;
};
export enum BillingSubscriptionSortFields {
- Id = 'id'
+ Id = 'id'
}
export type BooleanFieldComparison = {
- is?: InputMaybe;
- isNot?: InputMaybe;
+ is?: InputMaybe;
+ isNot?: InputMaybe;
};
-/** Visibility of the calendar channel */
export enum CalendarChannelVisibility {
- Metadata = 'METADATA',
- ShareEverything = 'SHARE_EVERYTHING'
+ Metadata = 'METADATA',
+ ShareEverything = 'SHARE_EVERYTHING'
}
export type Captcha = {
- __typename?: 'Captcha';
- provider?: Maybe;
- siteKey?: Maybe;
+ __typename?: 'Captcha';
+ provider?: Maybe;
+ siteKey?: Maybe;
};
export enum CaptchaDriverType {
- GoogleRecaptcha = 'GoogleRecaptcha',
- Turnstile = 'Turnstile'
+ GoogleRecaptcha = 'GoogleRecaptcha',
+ Turnstile = 'Turnstile'
}
export type ClientConfig = {
- __typename?: 'ClientConfig';
- api: ApiConfig;
- authProviders: AuthProviders;
- billing: Billing;
- captcha: Captcha;
- chromeExtensionId?: Maybe;
- debugMode: Scalars['Boolean']['output'];
- sentry: Sentry;
- signInPrefilled: Scalars['Boolean']['output'];
- signUpDisabled: Scalars['Boolean']['output'];
- support: Support;
- telemetry: Telemetry;
+ __typename?: 'ClientConfig';
+ api: ApiConfig;
+ authProviders: AuthProviders;
+ billing: Billing;
+ captcha: Captcha;
+ chromeExtensionId?: Maybe;
+ debugMode: Scalars['Boolean']['output'];
+ sentry: Sentry;
+ signInPrefilled: Scalars['Boolean']['output'];
+ signUpDisabled: Scalars['Boolean']['output'];
+ support: Support;
};
export type CreateAppTokenInput = {
- expiresAt: Scalars['DateTime']['input'];
+ expiresAt: Scalars['DateTime']['input'];
};
export type CreateFieldInput = {
- defaultValue?: InputMaybe;
- description?: InputMaybe;
- icon?: InputMaybe;
- isActive?: InputMaybe;
- isCustom?: InputMaybe;
- isNullable?: InputMaybe;
- isRemoteCreation?: InputMaybe;
- isSystem?: InputMaybe;
- label: Scalars['String']['input'];
- name: Scalars['String']['input'];
- objectMetadataId: Scalars['String']['input'];
- options?: InputMaybe;
- settings?: InputMaybe;
- type: FieldMetadataType;
+ defaultValue?: InputMaybe;
+ description?: InputMaybe;
+ icon?: InputMaybe;
+ isActive?: InputMaybe;
+ isCustom?: InputMaybe;
+ isNullable?: InputMaybe;
+ isRemoteCreation?: InputMaybe;
+ isSystem?: InputMaybe;
+ label: Scalars['String']['input'];
+ name: Scalars['String']['input'];
+ objectMetadataId: Scalars['String']['input'];
+ options?: InputMaybe;
+ settings?: InputMaybe;
+ type: FieldMetadataType;
};
export type CreateObjectInput = {
- description?: InputMaybe;
- icon?: InputMaybe;
- imageIdentifierFieldMetadataId?: InputMaybe;
- isRemote?: InputMaybe;
- labelIdentifierFieldMetadataId?: InputMaybe;
- labelPlural: Scalars['String']['input'];
- labelSingular: Scalars['String']['input'];
- namePlural: Scalars['String']['input'];
- nameSingular: Scalars['String']['input'];
- primaryKeyColumnType?: InputMaybe;
- primaryKeyFieldMetadataSettings?: InputMaybe;
+ description?: InputMaybe;
+ icon?: InputMaybe;
+ imageIdentifierFieldMetadataId?: InputMaybe;
+ isRemote?: InputMaybe;
+ labelIdentifierFieldMetadataId?: InputMaybe;
+ labelPlural: Scalars['String']['input'];
+ labelSingular: Scalars['String']['input'];
+ namePlural: Scalars['String']['input'];
+ nameSingular: Scalars['String']['input'];
+ primaryKeyColumnType?: InputMaybe;
+ primaryKeyFieldMetadataSettings?: InputMaybe;
};
export type CreateOneAppTokenInput = {
- /** The record to create */
- appToken: CreateAppTokenInput;
+ /** The record to create */
+ appToken: CreateAppTokenInput;
};
export type CreateOneFieldMetadataInput = {
- /** The record to create */
- field: CreateFieldInput;
+ /** The record to create */
+ field: CreateFieldInput;
};
export type CreateOneObjectInput = {
- /** The record to create */
- object: CreateObjectInput;
+ /** The record to create */
+ object: CreateObjectInput;
};
export type CreateOneRelationInput = {
- /** The record to create */
- relation: CreateRelationInput;
+ /** The record to create */
+ relation: CreateRelationInput;
};
export type CreateRelationInput = {
- description?: InputMaybe;
- fromDescription?: InputMaybe;
- fromIcon?: InputMaybe;
- fromLabel: Scalars['String']['input'];
- fromName: Scalars['String']['input'];
- fromObjectMetadataId: Scalars['String']['input'];
- relationType: RelationMetadataType;
- toDescription?: InputMaybe;
- toIcon?: InputMaybe;
- toLabel: Scalars['String']['input'];
- toName: Scalars['String']['input'];
- toObjectMetadataId: Scalars['String']['input'];
+ description?: InputMaybe;
+ fromDescription?: InputMaybe;
+ fromIcon?: InputMaybe;
+ fromLabel: Scalars['String']['input'];
+ fromName: Scalars['String']['input'];
+ fromObjectMetadataId: Scalars['String']['input'];
+ relationType: RelationMetadataType;
+ toDescription?: InputMaybe;
+ toIcon?: InputMaybe;
+ toLabel: Scalars['String']['input'];
+ toName: Scalars['String']['input'];
+ toObjectMetadataId: Scalars['String']['input'];
};
export type CreateRemoteServerInput = {
- foreignDataWrapperOptions: Scalars['JSON']['input'];
- foreignDataWrapperType: Scalars['String']['input'];
- label: Scalars['String']['input'];
- schema?: InputMaybe;
- userMappingOptions?: InputMaybe;
+ foreignDataWrapperOptions: Scalars['JSON']['input'];
+ foreignDataWrapperType: Scalars['String']['input'];
+ label: Scalars['String']['input'];
+ schema?: InputMaybe;
+ userMappingOptions?: InputMaybe;
};
export type CreateServerlessFunctionFromFileInput = {
- description?: InputMaybe;
- name: Scalars['String']['input'];
+ description?: InputMaybe;
+ name: Scalars['String']['input'];
};
export type CreateServerlessFunctionInput = {
- code: Scalars['String']['input'];
- description?: InputMaybe;
- name: Scalars['String']['input'];
+ code: Scalars['String']['input'];
+ description?: InputMaybe;
+ name: Scalars['String']['input'];
};
export type CursorPaging = {
- /** Paginate after opaque cursor */
- after?: InputMaybe;
- /** Paginate before opaque cursor */
- before?: InputMaybe;
- /** Paginate first */
- first?: InputMaybe;
- /** Paginate last */
- last?: InputMaybe;
+ /** Paginate after opaque cursor */
+ after?: InputMaybe;
+ /** Paginate before opaque cursor */
+ before?: InputMaybe;
+ /** Paginate first */
+ first?: InputMaybe;
+ /** Paginate last */
+ last?: InputMaybe;
};
export type DeleteOneFieldInput = {
- /** The id of the field to delete. */
- id: Scalars['UUID']['input'];
+ /** The id of the field to delete. */
+ id: Scalars['UUID']['input'];
};
export type DeleteOneObjectInput = {
- /** The id of the record to delete. */
- id: Scalars['UUID']['input'];
+ /** The id of the record to delete. */
+ id: Scalars['UUID']['input'];
};
export type DeleteOneRelationInput = {
- /** The id of the relation to delete. */
- id: Scalars['UUID']['input'];
+ /** The id of the relation to delete. */
+ id: Scalars['UUID']['input'];
};
export type DeleteServerlessFunctionInput = {
- /** The id of the function. */
- id: Scalars['ID']['input'];
+ /** The id of the function. */
+ id: Scalars['ID']['input'];
};
/** Schema update on a table */
export enum DistantTableUpdate {
- ColumnsAdded = 'COLUMNS_ADDED',
- ColumnsDeleted = 'COLUMNS_DELETED',
- ColumnsTypeChanged = 'COLUMNS_TYPE_CHANGED',
- TableDeleted = 'TABLE_DELETED'
+ ColumnsAdded = 'COLUMNS_ADDED',
+ ColumnsDeleted = 'COLUMNS_DELETED',
+ ColumnsTypeChanged = 'COLUMNS_TYPE_CHANGED',
+ TableDeleted = 'TABLE_DELETED'
}
export type EmailPasswordResetLink = {
- __typename?: 'EmailPasswordResetLink';
- /** Boolean that confirms query was dispatched */
- success: Scalars['Boolean']['output'];
+ __typename?: 'EmailPasswordResetLink';
+ /** Boolean that confirms query was dispatched */
+ success: Scalars['Boolean']['output'];
};
export type ExchangeAuthCode = {
- __typename?: 'ExchangeAuthCode';
- accessToken: AuthToken;
- loginToken: AuthToken;
- refreshToken: AuthToken;
+ __typename?: 'ExchangeAuthCode';
+ accessToken: AuthToken;
+ loginToken: AuthToken;
+ refreshToken: AuthToken;
};
export type ExecuteServerlessFunctionInput = {
- /** Id of the serverless function to execute */
- id: Scalars['UUID']['input'];
- /** Payload in JSON format */
- payload?: InputMaybe;
- /** Version of the serverless function to execute */
- version?: Scalars['String']['input'];
+ /** Id of the serverless function to execute */
+ id: Scalars['UUID']['input'];
+ /** Payload in JSON format */
+ payload: Scalars['JSON']['input'];
+ /** Version of the serverless function to execute */
+ version?: Scalars['String']['input'];
};
export type FeatureFlag = {
- __typename?: 'FeatureFlag';
- id: Scalars['UUID']['output'];
- key: Scalars['String']['output'];
- value: Scalars['Boolean']['output'];
- workspaceId: Scalars['String']['output'];
+ __typename?: 'FeatureFlag';
+ id: Scalars['UUID']['output'];
+ key: Scalars['String']['output'];
+ value: Scalars['Boolean']['output'];
+ workspaceId: Scalars['String']['output'];
};
export type FeatureFlagFilter = {
- and?: InputMaybe>;
- id?: InputMaybe;
- or?: InputMaybe>;
+ and?: InputMaybe>;
+ id?: InputMaybe;
+ or?: InputMaybe>;
};
export type FeatureFlagSort = {
- direction: SortDirection;
- field: FeatureFlagSortFields;
- nulls?: InputMaybe;
+ direction: SortDirection;
+ field: FeatureFlagSortFields;
+ nulls?: InputMaybe;
};
export enum FeatureFlagSortFields {
- Id = 'id'
+ Id = 'id'
}
export type FieldConnection = {
- __typename?: 'FieldConnection';
- /** Array of edges. */
- edges: Array;
- /** Paging information */
- pageInfo: PageInfo;
+ __typename?: 'FieldConnection';
+ /** Array of edges. */
+ edges: Array;
+ /** Paging information */
+ pageInfo: PageInfo;
};
/** Type of the field */
export enum FieldMetadataType {
- Actor = 'ACTOR',
- Address = 'ADDRESS',
- Boolean = 'BOOLEAN',
- Currency = 'CURRENCY',
- Date = 'DATE',
- DateTime = 'DATE_TIME',
- Email = 'EMAIL',
- Emails = 'EMAILS',
- FullName = 'FULL_NAME',
- Link = 'LINK',
- Links = 'LINKS',
- MultiSelect = 'MULTI_SELECT',
- Number = 'NUMBER',
- Numeric = 'NUMERIC',
- Phone = 'PHONE',
- Position = 'POSITION',
- Rating = 'RATING',
- RawJson = 'RAW_JSON',
- Relation = 'RELATION',
- RichText = 'RICH_TEXT',
- Select = 'SELECT',
- Text = 'TEXT',
- Uuid = 'UUID'
+ Actor = 'ACTOR',
+ Address = 'ADDRESS',
+ Array = 'ARRAY',
+ Boolean = 'BOOLEAN',
+ Currency = 'CURRENCY',
+ Date = 'DATE',
+ DateTime = 'DATE_TIME',
+ Email = 'EMAIL',
+ Emails = 'EMAILS',
+ FullName = 'FULL_NAME',
+ Link = 'LINK',
+ Links = 'LINKS',
+ MultiSelect = 'MULTI_SELECT',
+ Number = 'NUMBER',
+ Numeric = 'NUMERIC',
+ Phone = 'PHONE',
+ Phones = 'PHONES',
+ Position = 'POSITION',
+ Rating = 'RATING',
+ RawJson = 'RAW_JSON',
+ Relation = 'RELATION',
+ RichText = 'RICH_TEXT',
+ Select = 'SELECT',
+ Text = 'TEXT',
+ Uuid = 'UUID'
}
export enum FileFolder {
- Attachment = 'Attachment',
- PersonPicture = 'PersonPicture',
- ProfilePicture = 'ProfilePicture',
- ServerlessFunction = 'ServerlessFunction',
- WorkspaceLogo = 'WorkspaceLogo'
+ Attachment = 'Attachment',
+ PersonPicture = 'PersonPicture',
+ ProfilePicture = 'ProfilePicture',
+ ServerlessFunction = 'ServerlessFunction',
+ WorkspaceLogo = 'WorkspaceLogo'
}
export type FindManyRemoteTablesInput = {
- /** The id of the remote server. */
- id: Scalars['ID']['input'];
- /** Indicates if pending schema updates status should be computed. */
- shouldFetchPendingSchemaUpdates?: InputMaybe;
+ /** The id of the remote server. */
+ id: Scalars['ID']['input'];
+ /** Indicates if pending schema updates status should be computed. */
+ shouldFetchPendingSchemaUpdates?: InputMaybe;
};
export type FullName = {
- __typename?: 'FullName';
- firstName: Scalars['String']['output'];
- lastName: Scalars['String']['output'];
+ __typename?: 'FullName';
+ firstName: Scalars['String']['output'];
+ lastName: Scalars['String']['output'];
};
export type GetServerlessFunctionSourceCodeInput = {
- /** The id of the function. */
- id: Scalars['ID']['input'];
- /** The version of the function */
- version?: Scalars['String']['input'];
+ /** The id of the function. */
+ id: Scalars['ID']['input'];
+ /** The version of the function */
+ version?: Scalars['String']['input'];
};
export type InvalidatePassword = {
- __typename?: 'InvalidatePassword';
- /** Boolean that confirms query was dispatched */
- success: Scalars['Boolean']['output'];
+ __typename?: 'InvalidatePassword';
+ /** Boolean that confirms query was dispatched */
+ success: Scalars['Boolean']['output'];
};
export type LinkMetadata = {
- __typename?: 'LinkMetadata';
- label: Scalars['String']['output'];
- url: Scalars['String']['output'];
+ __typename?: 'LinkMetadata';
+ label: Scalars['String']['output'];
+ url: Scalars['String']['output'];
};
export type LinksMetadata = {
- __typename?: 'LinksMetadata';
- primaryLinkLabel: Scalars['String']['output'];
- primaryLinkUrl: Scalars['String']['output'];
- secondaryLinks?: Maybe>;
+ __typename?: 'LinksMetadata';
+ primaryLinkLabel: Scalars['String']['output'];
+ primaryLinkUrl: Scalars['String']['output'];
+ secondaryLinks?: Maybe>;
};
export type LoginToken = {
- __typename?: 'LoginToken';
- loginToken: AuthToken;
+ __typename?: 'LoginToken';
+ loginToken: AuthToken;
};
-/** Visibility of the message channel */
export enum MessageChannelVisibility {
- Metadata = 'METADATA',
- ShareEverything = 'SHARE_EVERYTHING',
- Subject = 'SUBJECT'
+ Metadata = 'METADATA',
+ ShareEverything = 'SHARE_EVERYTHING',
+ Subject = 'SUBJECT'
}
export type Mutation = {
- __typename?: 'Mutation';
- activateWorkspace: Workspace;
- addUserToWorkspace: User;
- authorizeApp: AuthorizeApp;
- challenge: LoginToken;
- checkoutSession: SessionEntity;
- createOneAppToken: AppToken;
- createOneField: Field;
- createOneObject: Object;
- createOneRelation: Relation;
- createOneRemoteServer: RemoteServer;
- createOneServerlessFunction: ServerlessFunction;
- createOneServerlessFunctionFromFile: ServerlessFunction;
- deleteCurrentWorkspace: Workspace;
- deleteOneField: Field;
- deleteOneObject: Object;
- deleteOneRelation: Relation;
- deleteOneRemoteServer: RemoteServer;
- deleteOneServerlessFunction: ServerlessFunction;
- deleteUser: User;
- disablePostgresProxy: PostgresCredentials;
- emailPasswordResetLink: EmailPasswordResetLink;
- enablePostgresProxy: PostgresCredentials;
- enableWorkflowTrigger: Scalars['Boolean']['output'];
- exchangeAuthorizationCode: ExchangeAuthCode;
- executeOneServerlessFunction: ServerlessFunctionExecutionResult;
- generateApiKeyToken: ApiKeyToken;
- generateJWT: AuthTokens;
- generateTransientToken: TransientToken;
- impersonate: Verify;
- publishServerlessFunction: ServerlessFunction;
- renewToken: AuthTokens;
- runWorkflowVersion: WorkflowRun;
- sendInviteLink: SendInviteLink;
- signUp: LoginToken;
- skipSyncEmailOnboardingStep: OnboardingStepSuccess;
- syncRemoteTable: RemoteTable;
- syncRemoteTableSchemaChanges: RemoteTable;
- track: Analytics;
- unsyncRemoteTable: RemoteTable;
- updateBillingSubscription: UpdateBillingEntity;
- updateOneField: Field;
- updateOneObject: Object;
- updateOneRemoteServer: RemoteServer;
- updateOneServerlessFunction: ServerlessFunction;
- updatePasswordViaResetToken: InvalidatePassword;
- updateWorkspace: Workspace;
- uploadFile: Scalars['String']['output'];
- uploadImage: Scalars['String']['output'];
- uploadProfilePicture: Scalars['String']['output'];
- uploadWorkspaceLogo: Scalars['String']['output'];
- verify: Verify;
+ __typename?: 'Mutation';
+ activateWorkflowVersion: Scalars['Boolean']['output'];
+ activateWorkspace: Workspace;
+ addUserToWorkspace: User;
+ authorizeApp: AuthorizeApp;
+ challenge: LoginToken;
+ checkoutSession: SessionEntity;
+ createOneAppToken: AppToken;
+ createOneField: Field;
+ createOneObject: Object;
+ createOneRelation: Relation;
+ createOneRemoteServer: RemoteServer;
+ createOneServerlessFunction: ServerlessFunction;
+ createOneServerlessFunctionFromFile: ServerlessFunction;
+ deactivateWorkflowVersion: Scalars['Boolean']['output'];
+ deleteCurrentWorkspace: Workspace;
+ deleteOneField: Field;
+ deleteOneObject: Object;
+ deleteOneRelation: Relation;
+ deleteOneRemoteServer: RemoteServer;
+ deleteOneServerlessFunction: ServerlessFunction;
+ deleteUser: User;
+ disablePostgresProxy: PostgresCredentials;
+ emailPasswordResetLink: EmailPasswordResetLink;
+ enablePostgresProxy: PostgresCredentials;
+ exchangeAuthorizationCode: ExchangeAuthCode;
+ executeOneServerlessFunction: ServerlessFunctionExecutionResult;
+ generateApiKeyToken: ApiKeyToken;
+ generateJWT: AuthTokens;
+ generateTransientToken: TransientToken;
+ impersonate: Verify;
+ publishServerlessFunction: ServerlessFunction;
+ renewToken: AuthTokens;
+ runWorkflowVersion: WorkflowRun;
+ sendInviteLink: SendInviteLink;
+ signUp: LoginToken;
+ skipSyncEmailOnboardingStep: OnboardingStepSuccess;
+ syncRemoteTable: RemoteTable;
+ syncRemoteTableSchemaChanges: RemoteTable;
+ track: Analytics;
+ unsyncRemoteTable: RemoteTable;
+ updateBillingSubscription: UpdateBillingEntity;
+ updateOneField: Field;
+ updateOneObject: Object;
+ updateOneRemoteServer: RemoteServer;
+ updateOneServerlessFunction: ServerlessFunction;
+ updatePasswordViaResetToken: InvalidatePassword;
+ updateWorkspace: Workspace;
+ uploadFile: Scalars['String']['output'];
+ uploadImage: Scalars['String']['output'];
+ uploadProfilePicture: Scalars['String']['output'];
+ uploadWorkspaceLogo: Scalars['String']['output'];
+ verify: Verify;
+};
+
+
+export type MutationActivateWorkflowVersionArgs = {
+ workflowVersionId: Scalars['String']['input'];
};
export type MutationActivateWorkspaceArgs = {
- data: ActivateWorkspaceInput;
+ data: ActivateWorkspaceInput;
};
export type MutationAddUserToWorkspaceArgs = {
- inviteHash: Scalars['String']['input'];
+ inviteHash: Scalars['String']['input'];
};
export type MutationAuthorizeAppArgs = {
- clientId: Scalars['String']['input'];
- codeChallenge?: InputMaybe;
- redirectUrl: Scalars['String']['input'];
+ clientId: Scalars['String']['input'];
+ codeChallenge?: InputMaybe;
+ redirectUrl: Scalars['String']['input'];
};
export type MutationChallengeArgs = {
- captchaToken?: InputMaybe;
- email: Scalars['String']['input'];
- password: Scalars['String']['input'];
+ captchaToken?: InputMaybe;
+ email: Scalars['String']['input'];
+ password: Scalars['String']['input'];
};
export type MutationCheckoutSessionArgs = {
- recurringInterval: SubscriptionInterval;
- successUrlPath?: InputMaybe;
+ recurringInterval: SubscriptionInterval;
+ successUrlPath?: InputMaybe;
};
export type MutationCreateOneAppTokenArgs = {
- input: CreateOneAppTokenInput;
+ input: CreateOneAppTokenInput;
};
export type MutationCreateOneFieldArgs = {
- input: CreateOneFieldMetadataInput;
+ input: CreateOneFieldMetadataInput;
};
export type MutationCreateOneObjectArgs = {
- input: CreateOneObjectInput;
+ input: CreateOneObjectInput;
};
export type MutationCreateOneRelationArgs = {
- input: CreateOneRelationInput;
+ input: CreateOneRelationInput;
};
export type MutationCreateOneRemoteServerArgs = {
- input: CreateRemoteServerInput;
+ input: CreateRemoteServerInput;
};
export type MutationCreateOneServerlessFunctionArgs = {
- input: CreateServerlessFunctionInput;
+ input: CreateServerlessFunctionInput;
};
export type MutationCreateOneServerlessFunctionFromFileArgs = {
- file: Scalars['Upload']['input'];
- input: CreateServerlessFunctionFromFileInput;
+ file: Scalars['Upload']['input'];
+ input: CreateServerlessFunctionFromFileInput;
+};
+
+
+export type MutationDeactivateWorkflowVersionArgs = {
+ workflowVersionId: Scalars['String']['input'];
};
export type MutationDeleteOneFieldArgs = {
- input: DeleteOneFieldInput;
+ input: DeleteOneFieldInput;
};
export type MutationDeleteOneObjectArgs = {
- input: DeleteOneObjectInput;
+ input: DeleteOneObjectInput;
};
export type MutationDeleteOneRelationArgs = {
- input: DeleteOneRelationInput;
+ input: DeleteOneRelationInput;
};
export type MutationDeleteOneRemoteServerArgs = {
- input: RemoteServerIdInput;
+ input: RemoteServerIdInput;
};
export type MutationDeleteOneServerlessFunctionArgs = {
- input: DeleteServerlessFunctionInput;
+ input: DeleteServerlessFunctionInput;
};
export type MutationEmailPasswordResetLinkArgs = {
- email: Scalars['String']['input'];
-};
-
-
-export type MutationEnableWorkflowTriggerArgs = {
- workflowVersionId: Scalars['String']['input'];
+ email: Scalars['String']['input'];
};
export type MutationExchangeAuthorizationCodeArgs = {
- authorizationCode: Scalars['String']['input'];
- clientSecret?: InputMaybe;
- codeVerifier?: InputMaybe;
+ authorizationCode: Scalars['String']['input'];
+ clientSecret?: InputMaybe;
+ codeVerifier?: InputMaybe;
};
export type MutationExecuteOneServerlessFunctionArgs = {
- input: ExecuteServerlessFunctionInput;
+ input: ExecuteServerlessFunctionInput;
};
export type MutationGenerateApiKeyTokenArgs = {
- apiKeyId: Scalars['String']['input'];
- expiresAt: Scalars['String']['input'];
+ apiKeyId: Scalars['String']['input'];
+ expiresAt: Scalars['String']['input'];
};
export type MutationGenerateJwtArgs = {
- workspaceId: Scalars['String']['input'];
+ workspaceId: Scalars['String']['input'];
};
export type MutationImpersonateArgs = {
- userId: Scalars['String']['input'];
+ userId: Scalars['String']['input'];
};
export type MutationPublishServerlessFunctionArgs = {
- input: PublishServerlessFunctionInput;
+ input: PublishServerlessFunctionInput;
};
export type MutationRenewTokenArgs = {
- appToken: Scalars['String']['input'];
+ appToken: Scalars['String']['input'];
};
export type MutationRunWorkflowVersionArgs = {
- input: RunWorkflowVersionInput;
+ input: RunWorkflowVersionInput;
};
export type MutationSendInviteLinkArgs = {
- emails: Array;
+ emails: Array;
};
export type MutationSignUpArgs = {
- captchaToken?: InputMaybe;
- email: Scalars['String']['input'];
- password: Scalars['String']['input'];
- workspaceInviteHash?: InputMaybe;
+ captchaToken?: InputMaybe;
+ email: Scalars['String']['input'];
+ password: Scalars['String']['input'];
+ workspaceInviteHash?: InputMaybe;
};
export type MutationSyncRemoteTableArgs = {
- input: RemoteTableInput;
+ input: RemoteTableInput;
};
export type MutationSyncRemoteTableSchemaChangesArgs = {
- input: RemoteTableInput;
+ input: RemoteTableInput;
};
export type MutationTrackArgs = {
- data: Scalars['JSON']['input'];
- type: Scalars['String']['input'];
+ data: Scalars['JSON']['input'];
+ type: Scalars['String']['input'];
};
export type MutationUnsyncRemoteTableArgs = {
- input: RemoteTableInput;
+ input: RemoteTableInput;
};
export type MutationUpdateOneFieldArgs = {
- input: UpdateOneFieldMetadataInput;
+ input: UpdateOneFieldMetadataInput;
};
export type MutationUpdateOneObjectArgs = {
- input: UpdateOneObjectInput;
+ input: UpdateOneObjectInput;
};
export type MutationUpdateOneRemoteServerArgs = {
- input: UpdateRemoteServerInput;
+ input: UpdateRemoteServerInput;
};
export type MutationUpdateOneServerlessFunctionArgs = {
- input: UpdateServerlessFunctionInput;
+ input: UpdateServerlessFunctionInput;
};
export type MutationUpdatePasswordViaResetTokenArgs = {
- newPassword: Scalars['String']['input'];
- passwordResetToken: Scalars['String']['input'];
+ newPassword: Scalars['String']['input'];
+ passwordResetToken: Scalars['String']['input'];
};
export type MutationUpdateWorkspaceArgs = {
- data: UpdateWorkspaceInput;
+ data: UpdateWorkspaceInput;
};
export type MutationUploadFileArgs = {
- file: Scalars['Upload']['input'];
- fileFolder?: InputMaybe;
+ file: Scalars['Upload']['input'];
+ fileFolder?: InputMaybe;
};
export type MutationUploadImageArgs = {
- file: Scalars['Upload']['input'];
- fileFolder?: InputMaybe;
+ file: Scalars['Upload']['input'];
+ fileFolder?: InputMaybe;
};
export type MutationUploadProfilePictureArgs = {
- file: Scalars['Upload']['input'];
+ file: Scalars['Upload']['input'];
};
export type MutationUploadWorkspaceLogoArgs = {
- file: Scalars['Upload']['input'];
+ file: Scalars['Upload']['input'];
};
export type MutationVerifyArgs = {
- loginToken: Scalars['String']['input'];
+ loginToken: Scalars['String']['input'];
};
export type ObjectConnection = {
- __typename?: 'ObjectConnection';
- /** Array of edges. */
- edges: Array;
- /** Paging information */
- pageInfo: PageInfo;
+ __typename?: 'ObjectConnection';
+ /** Array of edges. */
+ edges: Array;
+ /** Paging information */
+ pageInfo: PageInfo;
};
export type ObjectFieldsConnection = {
- __typename?: 'ObjectFieldsConnection';
- /** Array of edges. */
- edges: Array;
- /** Paging information */
- pageInfo: PageInfo;
+ __typename?: 'ObjectFieldsConnection';
+ /** Array of edges. */
+ edges: Array;
+ /** Paging information */
+ pageInfo: PageInfo;
};
/** Onboarding status */
export enum OnboardingStatus {
- Completed = 'COMPLETED',
- InviteTeam = 'INVITE_TEAM',
- PlanRequired = 'PLAN_REQUIRED',
- ProfileCreation = 'PROFILE_CREATION',
- SyncEmail = 'SYNC_EMAIL',
- WorkspaceActivation = 'WORKSPACE_ACTIVATION'
+ Completed = 'COMPLETED',
+ InviteTeam = 'INVITE_TEAM',
+ PlanRequired = 'PLAN_REQUIRED',
+ ProfileCreation = 'PROFILE_CREATION',
+ SyncEmail = 'SYNC_EMAIL',
+ WorkspaceActivation = 'WORKSPACE_ACTIVATION'
}
export type OnboardingStepSuccess = {
- __typename?: 'OnboardingStepSuccess';
- /** Boolean that confirms query was dispatched */
- success: Scalars['Boolean']['output'];
+ __typename?: 'OnboardingStepSuccess';
+ /** Boolean that confirms query was dispatched */
+ success: Scalars['Boolean']['output'];
};
export type PageInfo = {
- __typename?: 'PageInfo';
- /** The cursor of the last returned record. */
- endCursor?: Maybe;
- /** true if paging forward and there are more records. */
- hasNextPage?: Maybe;
- /** true if paging backwards and there are more records. */
- hasPreviousPage?: Maybe;
- /** The cursor of the first returned record. */
- startCursor?: Maybe;
+ __typename?: 'PageInfo';
+ /** The cursor of the last returned record. */
+ endCursor?: Maybe;
+ /** true if paging forward and there are more records. */
+ hasNextPage?: Maybe;
+ /** true if paging backwards and there are more records. */
+ hasPreviousPage?: Maybe;
+ /** The cursor of the first returned record. */
+ startCursor?: Maybe;
};
export type PostgresCredentials = {
- __typename?: 'PostgresCredentials';
- id: Scalars['UUID']['output'];
- password: Scalars['String']['output'];
- user: Scalars['String']['output'];
- workspaceId: Scalars['String']['output'];
+ __typename?: 'PostgresCredentials';
+ id: Scalars['UUID']['output'];
+ password: Scalars['String']['output'];
+ user: Scalars['String']['output'];
+ workspaceId: Scalars['String']['output'];
};
export type ProductPriceEntity = {
- __typename?: 'ProductPriceEntity';
- created: Scalars['Float']['output'];
- recurringInterval: SubscriptionInterval;
- stripePriceId: Scalars['String']['output'];
- unitAmount: Scalars['Float']['output'];
+ __typename?: 'ProductPriceEntity';
+ created: Scalars['Float']['output'];
+ recurringInterval: SubscriptionInterval;
+ stripePriceId: Scalars['String']['output'];
+ unitAmount: Scalars['Float']['output'];
};
export type ProductPricesEntity = {
- __typename?: 'ProductPricesEntity';
- productPrices: Array;
- totalNumberOfPrices: Scalars['Int']['output'];
+ __typename?: 'ProductPricesEntity';
+ productPrices: Array;
+ totalNumberOfPrices: Scalars['Int']['output'];
};
export type PublishServerlessFunctionInput = {
- /** The id of the function. */
- id: Scalars['ID']['input'];
+ /** The id of the function. */
+ id: Scalars['ID']['input'];
};
export type Query = {
- __typename?: 'Query';
- billingPortalSession: SessionEntity;
- checkUserExists: UserExists;
- checkWorkspaceInviteHashIsValid: WorkspaceInviteHashValid;
- clientConfig: ClientConfig;
- currentUser: User;
- currentWorkspace: Workspace;
- field: Field;
- fields: FieldConnection;
- findDistantTablesWithStatus: Array;
- findManyRemoteServersByType: Array;
- findOneRemoteServerById: RemoteServer;
- findWorkspaceFromInviteHash: Workspace;
- getAISQLQuery: AisqlQueryResult;
- getPostgresCredentials?: Maybe;
- getProductPrices: ProductPricesEntity;
- getServerlessFunctionSourceCode: Scalars['String']['output'];
- getTimelineCalendarEventsFromCompanyId: TimelineCalendarEventsWithTotal;
- getTimelineCalendarEventsFromPersonId: TimelineCalendarEventsWithTotal;
- getTimelineThreadsFromCompanyId: TimelineThreadsWithTotal;
- getTimelineThreadsFromPersonId: TimelineThreadsWithTotal;
- object: Object;
- objects: ObjectConnection;
- relation: Relation;
- relations: RelationConnection;
- serverlessFunction: ServerlessFunction;
- serverlessFunctions: ServerlessFunctionConnection;
- validatePasswordResetToken: ValidatePasswordResetToken;
+ __typename?: 'Query';
+ billingPortalSession: SessionEntity;
+ checkUserExists: UserExists;
+ checkWorkspaceInviteHashIsValid: WorkspaceInviteHashValid;
+ clientConfig: ClientConfig;
+ currentUser: User;
+ currentWorkspace: Workspace;
+ field: Field;
+ fields: FieldConnection;
+ findDistantTablesWithStatus: Array;
+ findManyRemoteServersByType: Array;
+ findOneRemoteServerById: RemoteServer;
+ findWorkspaceFromInviteHash: Workspace;
+ getAISQLQuery: AisqlQueryResult;
+ getAvailablePackages: Scalars['JSON']['output'];
+ getPostgresCredentials?: Maybe;
+ getProductPrices: ProductPricesEntity;
+ getServerlessFunctionSourceCode?: Maybe;
+ getTimelineCalendarEventsFromCompanyId: TimelineCalendarEventsWithTotal;
+ getTimelineCalendarEventsFromPersonId: TimelineCalendarEventsWithTotal;
+ getTimelineThreadsFromCompanyId: TimelineThreadsWithTotal;
+ getTimelineThreadsFromPersonId: TimelineThreadsWithTotal;
+ object: Object;
+ objects: ObjectConnection;
+ relation: Relation;
+ relations: RelationConnection;
+ serverlessFunction: ServerlessFunction;
+ serverlessFunctions: ServerlessFunctionConnection;
+ validatePasswordResetToken: ValidatePasswordResetToken;
};
export type QueryBillingPortalSessionArgs = {
- returnUrlPath?: InputMaybe;
+ returnUrlPath?: InputMaybe;
};
export type QueryCheckUserExistsArgs = {
- captchaToken?: InputMaybe;
- email: Scalars['String']['input'];
+ captchaToken?: InputMaybe;
+ email: Scalars['String']['input'];
};
export type QueryCheckWorkspaceInviteHashIsValidArgs = {
- inviteHash: Scalars['String']['input'];
+ inviteHash: Scalars['String']['input'];
};
export type QueryFieldArgs = {
- id: Scalars['UUID']['input'];
+ id: Scalars['UUID']['input'];
};
export type QueryFieldsArgs = {
- filter?: FieldFilter;
- paging?: CursorPaging;
+ filter?: FieldFilter;
+ paging?: CursorPaging;
};
export type QueryFindDistantTablesWithStatusArgs = {
- input: FindManyRemoteTablesInput;
+ input: FindManyRemoteTablesInput;
};
export type QueryFindManyRemoteServersByTypeArgs = {
- input: RemoteServerTypeInput;
+ input: RemoteServerTypeInput;
};
export type QueryFindOneRemoteServerByIdArgs = {
- input: RemoteServerIdInput;
+ input: RemoteServerIdInput;
};
export type QueryFindWorkspaceFromInviteHashArgs = {
- inviteHash: Scalars['String']['input'];
+ inviteHash: Scalars['String']['input'];
};
export type QueryGetAisqlQueryArgs = {
- text: Scalars['String']['input'];
+ text: Scalars['String']['input'];
};
export type QueryGetProductPricesArgs = {
- product: Scalars['String']['input'];
+ product: Scalars['String']['input'];
};
export type QueryGetServerlessFunctionSourceCodeArgs = {
- input: GetServerlessFunctionSourceCodeInput;
+ input: GetServerlessFunctionSourceCodeInput;
};
export type QueryGetTimelineCalendarEventsFromCompanyIdArgs = {
- companyId: Scalars['UUID']['input'];
- page: Scalars['Int']['input'];
- pageSize: Scalars['Int']['input'];
+ companyId: Scalars['UUID']['input'];
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
};
export type QueryGetTimelineCalendarEventsFromPersonIdArgs = {
- page: Scalars['Int']['input'];
- pageSize: Scalars['Int']['input'];
- personId: Scalars['UUID']['input'];
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
+ personId: Scalars['UUID']['input'];
};
export type QueryGetTimelineThreadsFromCompanyIdArgs = {
- companyId: Scalars['UUID']['input'];
- page: Scalars['Int']['input'];
- pageSize: Scalars['Int']['input'];
+ companyId: Scalars['UUID']['input'];
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
};
export type QueryGetTimelineThreadsFromPersonIdArgs = {
- page: Scalars['Int']['input'];
- pageSize: Scalars['Int']['input'];
- personId: Scalars['UUID']['input'];
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
+ personId: Scalars['UUID']['input'];
};
export type QueryObjectArgs = {
- id: Scalars['UUID']['input'];
+ id: Scalars['UUID']['input'];
};
export type QueryObjectsArgs = {
- filter?: ObjectFilter;
- paging?: CursorPaging;
+ filter?: ObjectFilter;
+ paging?: CursorPaging;
};
export type QueryRelationArgs = {
- id: Scalars['UUID']['input'];
+ id: Scalars['UUID']['input'];
};
export type QueryRelationsArgs = {
- paging?: CursorPaging;
+ paging?: CursorPaging;
};
export type QueryServerlessFunctionArgs = {
- id: Scalars['UUID']['input'];
+ id: Scalars['UUID']['input'];
};
export type QueryServerlessFunctionsArgs = {
- filter?: ServerlessFunctionFilter;
- paging?: CursorPaging;
- sorting?: Array;
+ filter?: ServerlessFunctionFilter;
+ paging?: CursorPaging;
+ sorting?: Array;
};
export type QueryValidatePasswordResetTokenArgs = {
- passwordResetToken: Scalars['String']['input'];
+ passwordResetToken: Scalars['String']['input'];
};
export type RelationConnection = {
- __typename?: 'RelationConnection';
- /** Array of edges. */
- edges: Array;
- /** Paging information */
- pageInfo: PageInfo;
+ __typename?: 'RelationConnection';
+ /** Array of edges. */
+ edges: Array;
+ /** Paging information */
+ pageInfo: PageInfo;
};
export type RelationDefinition = {
- __typename?: 'RelationDefinition';
- direction: RelationDefinitionType;
- relationId: Scalars['UUID']['output'];
- sourceFieldMetadata: Field;
- sourceObjectMetadata: Object;
- targetFieldMetadata: Field;
- targetObjectMetadata: Object;
+ __typename?: 'RelationDefinition';
+ direction: RelationDefinitionType;
+ relationId: Scalars['UUID']['output'];
+ sourceFieldMetadata: Field;
+ sourceObjectMetadata: Object;
+ targetFieldMetadata: Field;
+ targetObjectMetadata: Object;
};
/** Relation definition type */
export enum RelationDefinitionType {
- ManyToMany = 'MANY_TO_MANY',
- ManyToOne = 'MANY_TO_ONE',
- OneToMany = 'ONE_TO_MANY',
- OneToOne = 'ONE_TO_ONE'
+ ManyToMany = 'MANY_TO_MANY',
+ ManyToOne = 'MANY_TO_ONE',
+ OneToMany = 'ONE_TO_MANY',
+ OneToOne = 'ONE_TO_ONE'
}
/** Type of the relation */
export enum RelationMetadataType {
- ManyToMany = 'MANY_TO_MANY',
- ManyToOne = 'MANY_TO_ONE',
- OneToMany = 'ONE_TO_MANY',
- OneToOne = 'ONE_TO_ONE'
+ ManyToMany = 'MANY_TO_MANY',
+ ManyToOne = 'MANY_TO_ONE',
+ OneToMany = 'ONE_TO_MANY',
+ OneToOne = 'ONE_TO_ONE'
}
export type RemoteServer = {
- __typename?: 'RemoteServer';
- createdAt: Scalars['DateTime']['output'];
- foreignDataWrapperId: Scalars['ID']['output'];
- foreignDataWrapperOptions?: Maybe;
- foreignDataWrapperType: Scalars['String']['output'];
- id: Scalars['ID']['output'];
- label: Scalars['String']['output'];
- schema?: Maybe;
- updatedAt: Scalars['DateTime']['output'];
- userMappingOptions?: Maybe;
+ __typename?: 'RemoteServer';
+ createdAt: Scalars['DateTime']['output'];
+ foreignDataWrapperId: Scalars['ID']['output'];
+ foreignDataWrapperOptions?: Maybe;
+ foreignDataWrapperType: Scalars['String']['output'];
+ id: Scalars['ID']['output'];
+ label: Scalars['String']['output'];
+ schema?: Maybe;
+ updatedAt: Scalars['DateTime']['output'];
+ userMappingOptions?: Maybe;
};
export type RemoteServerIdInput = {
- /** The id of the record. */
- id: Scalars['ID']['input'];
+ /** The id of the record. */
+ id: Scalars['ID']['input'];
};
export type RemoteServerTypeInput = {
- foreignDataWrapperType: Scalars['String']['input'];
+ foreignDataWrapperType: Scalars['String']['input'];
};
export type RemoteTable = {
- __typename?: 'RemoteTable';
- id?: Maybe;
- name: Scalars['String']['output'];
- schema?: Maybe;
- schemaPendingUpdates?: Maybe>;
- status: RemoteTableStatus;
+ __typename?: 'RemoteTable';
+ id?: Maybe;
+ name: Scalars['String']['output'];
+ schema?: Maybe;
+ schemaPendingUpdates?: Maybe>;
+ status: RemoteTableStatus;
};
export type RemoteTableInput = {
- name: Scalars['String']['input'];
- remoteServerId: Scalars['ID']['input'];
+ name: Scalars['String']['input'];
+ remoteServerId: Scalars['ID']['input'];
};
/** Status of the table */
export enum RemoteTableStatus {
- NotSynced = 'NOT_SYNCED',
- Synced = 'SYNCED'
+ NotSynced = 'NOT_SYNCED',
+ Synced = 'SYNCED'
}
export type RunWorkflowVersionInput = {
- /** Execution result in JSON format */
- payload?: InputMaybe;
- /** Workflow version ID */
- workflowVersionId: Scalars['String']['input'];
+ /** Execution result in JSON format */
+ payload?: InputMaybe;
+ /** Workflow version ID */
+ workflowVersionId: Scalars['String']['input'];
};
export type SendInviteLink = {
- __typename?: 'SendInviteLink';
- /** Boolean that confirms query was dispatched */
- success: Scalars['Boolean']['output'];
+ __typename?: 'SendInviteLink';
+ /** Boolean that confirms query was dispatched */
+ success: Scalars['Boolean']['output'];
};
export type Sentry = {
- __typename?: 'Sentry';
- dsn?: Maybe;
- environment?: Maybe;
- release?: Maybe;
+ __typename?: 'Sentry';
+ dsn?: Maybe;
+ environment?: Maybe;
+ release?: Maybe;
};
export type ServerlessFunction = {
- __typename?: 'ServerlessFunction';
- createdAt: Scalars['DateTime']['output'];
- description?: Maybe;
- id: Scalars['UUID']['output'];
- latestVersion?: Maybe;
- name: Scalars['String']['output'];
- runtime: Scalars['String']['output'];
- sourceCodeHash: Scalars['String']['output'];
- syncStatus: ServerlessFunctionSyncStatus;
- updatedAt: Scalars['DateTime']['output'];
+ __typename?: 'ServerlessFunction';
+ createdAt: Scalars['DateTime']['output'];
+ description?: Maybe;
+ id: Scalars['UUID']['output'];
+ latestVersion?: Maybe;
+ name: Scalars['String']['output'];
+ runtime: Scalars['String']['output'];
+ sourceCodeHash: Scalars['String']['output'];
+ syncStatus: ServerlessFunctionSyncStatus;
+ updatedAt: Scalars['DateTime']['output'];
};
export type ServerlessFunctionConnection = {
- __typename?: 'ServerlessFunctionConnection';
- /** Array of edges. */
- edges: Array;
- /** Paging information */
- pageInfo: PageInfo;
+ __typename?: 'ServerlessFunctionConnection';
+ /** Array of edges. */
+ edges: Array;
+ /** Paging information */
+ pageInfo: PageInfo;
};
export type ServerlessFunctionEdge = {
- __typename?: 'ServerlessFunctionEdge';
- /** Cursor for this node. */
- cursor: Scalars['ConnectionCursor']['output'];
- /** The node containing the ServerlessFunction */
- node: ServerlessFunction;
+ __typename?: 'ServerlessFunctionEdge';
+ /** Cursor for this node. */
+ cursor: Scalars['ConnectionCursor']['output'];
+ /** The node containing the ServerlessFunction */
+ node: ServerlessFunction;
};
export type ServerlessFunctionExecutionResult = {
- __typename?: 'ServerlessFunctionExecutionResult';
- /** Execution result in JSON format */
- data?: Maybe;
- /** Execution duration in milliseconds */
- duration: Scalars['Float']['output'];
- /** Execution error in JSON format */
- error?: Maybe;
- /** Execution status */
- status: ServerlessFunctionExecutionStatus;
+ __typename?: 'ServerlessFunctionExecutionResult';
+ /** Execution result in JSON format */
+ data?: Maybe;
+ /** Execution duration in milliseconds */
+ duration: Scalars['Float']['output'];
+ /** Execution error in JSON format */
+ error?: Maybe;
+ /** Execution status */
+ status: ServerlessFunctionExecutionStatus;
};
/** Status of the serverless function execution */
export enum ServerlessFunctionExecutionStatus {
- Error = 'ERROR',
- Success = 'SUCCESS'
+ Error = 'ERROR',
+ Success = 'SUCCESS'
}
export type ServerlessFunctionFilter = {
- and?: InputMaybe>;
- id?: InputMaybe;
- or?: InputMaybe>;
+ and?: InputMaybe>;
+ id?: InputMaybe;
+ or?: InputMaybe>;
};
export type ServerlessFunctionSort = {
- direction: SortDirection;
- field: ServerlessFunctionSortFields;
- nulls?: InputMaybe;
+ direction: SortDirection;
+ field: ServerlessFunctionSortFields;
+ nulls?: InputMaybe;
};
export enum ServerlessFunctionSortFields {
- Id = 'id'
+ Id = 'id'
}
/** SyncStatus of the serverlessFunction */
export enum ServerlessFunctionSyncStatus {
- NotReady = 'NOT_READY',
- Ready = 'READY'
+ NotReady = 'NOT_READY',
+ Ready = 'READY'
}
export type SessionEntity = {
- __typename?: 'SessionEntity';
- url?: Maybe;
+ __typename?: 'SessionEntity';
+ url?: Maybe;
};
/** Sort Directions */
export enum SortDirection {
- Asc = 'ASC',
- Desc = 'DESC'
+ Asc = 'ASC',
+ Desc = 'DESC'
}
/** Sort Nulls Options */
export enum SortNulls {
- NullsFirst = 'NULLS_FIRST',
- NullsLast = 'NULLS_LAST'
+ NullsFirst = 'NULLS_FIRST',
+ NullsLast = 'NULLS_LAST'
}
export enum SubscriptionInterval {
- Day = 'Day',
- Month = 'Month',
- Week = 'Week',
- Year = 'Year'
+ Day = 'Day',
+ Month = 'Month',
+ Week = 'Week',
+ Year = 'Year'
}
export enum SubscriptionStatus {
- Active = 'Active',
- Canceled = 'Canceled',
- Incomplete = 'Incomplete',
- IncompleteExpired = 'IncompleteExpired',
- PastDue = 'PastDue',
- Paused = 'Paused',
- Trialing = 'Trialing',
- Unpaid = 'Unpaid'
+ Active = 'Active',
+ Canceled = 'Canceled',
+ Incomplete = 'Incomplete',
+ IncompleteExpired = 'IncompleteExpired',
+ PastDue = 'PastDue',
+ Paused = 'Paused',
+ Trialing = 'Trialing',
+ Unpaid = 'Unpaid'
}
export type Support = {
- __typename?: 'Support';
- supportDriver: Scalars['String']['output'];
- supportFrontChatId?: Maybe;
-};
-
-export type Telemetry = {
- __typename?: 'Telemetry';
- enabled: Scalars['Boolean']['output'];
+ __typename?: 'Support';
+ supportDriver: Scalars['String']['output'];
+ supportFrontChatId?: Maybe;
};
export type TimelineCalendarEvent = {
- __typename?: 'TimelineCalendarEvent';
- conferenceLink: LinksMetadata;
- conferenceSolution: Scalars['String']['output'];
- description: Scalars['String']['output'];
- endsAt: Scalars['DateTime']['output'];
- id: Scalars['UUID']['output'];
- isCanceled: Scalars['Boolean']['output'];
- isFullDay: Scalars['Boolean']['output'];
- location: Scalars['String']['output'];
- participants: Array;
- startsAt: Scalars['DateTime']['output'];
- title: Scalars['String']['output'];
- visibility: CalendarChannelVisibility;
+ __typename?: 'TimelineCalendarEvent';
+ conferenceLink: LinksMetadata;
+ conferenceSolution: Scalars['String']['output'];
+ description: Scalars['String']['output'];
+ endsAt: Scalars['DateTime']['output'];
+ id: Scalars['UUID']['output'];
+ isCanceled: Scalars['Boolean']['output'];
+ isFullDay: Scalars['Boolean']['output'];
+ location: Scalars['String']['output'];
+ participants: Array;
+ startsAt: Scalars['DateTime']['output'];
+ title: Scalars['String']['output'];
+ visibility: CalendarChannelVisibility;
};
export type TimelineCalendarEventParticipant = {
- __typename?: 'TimelineCalendarEventParticipant';
- avatarUrl: Scalars['String']['output'];
- displayName: Scalars['String']['output'];
- firstName: Scalars['String']['output'];
- handle: Scalars['String']['output'];
- lastName: Scalars['String']['output'];
- personId?: Maybe;
- workspaceMemberId?: Maybe;
+ __typename?: 'TimelineCalendarEventParticipant';
+ avatarUrl: Scalars['String']['output'];
+ displayName: Scalars['String']['output'];
+ firstName: Scalars['String']['output'];
+ handle: Scalars['String']['output'];
+ lastName: Scalars['String']['output'];
+ personId?: Maybe;
+ workspaceMemberId?: Maybe;
};
export type TimelineCalendarEventsWithTotal = {
- __typename?: 'TimelineCalendarEventsWithTotal';
- timelineCalendarEvents: Array;
- totalNumberOfCalendarEvents: Scalars['Int']['output'];
+ __typename?: 'TimelineCalendarEventsWithTotal';
+ timelineCalendarEvents: Array;
+ totalNumberOfCalendarEvents: Scalars['Int']['output'];
};
export type TimelineThread = {
- __typename?: 'TimelineThread';
- firstParticipant: TimelineThreadParticipant;
- id: Scalars['UUID']['output'];
- lastMessageBody: Scalars['String']['output'];
- lastMessageReceivedAt: Scalars['DateTime']['output'];
- lastTwoParticipants: Array;
- numberOfMessagesInThread: Scalars['Float']['output'];
- participantCount: Scalars['Float']['output'];
- read: Scalars['Boolean']['output'];
- subject: Scalars['String']['output'];
- visibility: MessageChannelVisibility;
+ __typename?: 'TimelineThread';
+ firstParticipant: TimelineThreadParticipant;
+ id: Scalars['UUID']['output'];
+ lastMessageBody: Scalars['String']['output'];
+ lastMessageReceivedAt: Scalars['DateTime']['output'];
+ lastTwoParticipants: Array;
+ numberOfMessagesInThread: Scalars['Float']['output'];
+ participantCount: Scalars['Float']['output'];
+ read: Scalars['Boolean']['output'];
+ subject: Scalars['String']['output'];
+ visibility: MessageChannelVisibility;
};
export type TimelineThreadParticipant = {
- __typename?: 'TimelineThreadParticipant';
- avatarUrl: Scalars['String']['output'];
- displayName: Scalars['String']['output'];
- firstName: Scalars['String']['output'];
- handle: Scalars['String']['output'];
- lastName: Scalars['String']['output'];
- personId?: Maybe;
- workspaceMemberId?: Maybe;
+ __typename?: 'TimelineThreadParticipant';
+ avatarUrl: Scalars['String']['output'];
+ displayName: Scalars['String']['output'];
+ firstName: Scalars['String']['output'];
+ handle: Scalars['String']['output'];
+ lastName: Scalars['String']['output'];
+ personId?: Maybe;
+ workspaceMemberId?: Maybe;
};
export type TimelineThreadsWithTotal = {
- __typename?: 'TimelineThreadsWithTotal';
- timelineThreads: Array;
- totalNumberOfThreads: Scalars['Int']['output'];
+ __typename?: 'TimelineThreadsWithTotal';
+ timelineThreads: Array;
+ totalNumberOfThreads: Scalars['Int']['output'];
};
export type TransientToken = {
- __typename?: 'TransientToken';
- transientToken: AuthToken;
+ __typename?: 'TransientToken';
+ transientToken: AuthToken;
};
export type UuidFilterComparison = {
- eq?: InputMaybe;
- gt?: InputMaybe;
- gte?: InputMaybe;
- iLike?: InputMaybe;
- in?: InputMaybe>;
- is?: InputMaybe;
- isNot?: InputMaybe;
- like?: InputMaybe;
- lt?: InputMaybe;
- lte?: InputMaybe;
- neq?: InputMaybe;
- notILike?: InputMaybe;
- notIn?: InputMaybe>;
- notLike?: InputMaybe;
+ eq?: InputMaybe;
+ gt?: InputMaybe;
+ gte?: InputMaybe;
+ iLike?: InputMaybe;
+ in?: InputMaybe>;
+ is?: InputMaybe;
+ isNot?: InputMaybe;
+ like?: InputMaybe;
+ lt?: InputMaybe;
+ lte?: InputMaybe;
+ neq?: InputMaybe;
+ notILike?: InputMaybe;
+ notIn?: InputMaybe>;
+ notLike?: InputMaybe;
};
export type UpdateBillingEntity = {
- __typename?: 'UpdateBillingEntity';
- /** Boolean that confirms query was successful */
- success: Scalars['Boolean']['output'];
+ __typename?: 'UpdateBillingEntity';
+ /** Boolean that confirms query was successful */
+ success: Scalars['Boolean']['output'];
};
export type UpdateFieldInput = {
- defaultValue?: InputMaybe;
- description?: InputMaybe;
- icon?: InputMaybe;
- isActive?: InputMaybe;
- isCustom?: InputMaybe;
- isNullable?: InputMaybe;
- isSystem?: InputMaybe