Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc6aafd3c6 | ||
|
|
8076ff5b82 | ||
|
|
4257f30f12 | ||
|
|
28a1354928 | ||
|
|
a2d2db441f | ||
|
|
a4882089b1 | ||
|
|
f2828883ad | ||
|
|
1333c64d98 | ||
|
|
e1054b0474 | ||
|
|
457c6ed113 | ||
|
|
93c2ba153b | ||
|
|
b6e8103df7 | ||
|
|
ea850f323a | ||
|
|
fa5f758228 | ||
|
|
8694840b92 | ||
|
|
fba9ae6dfe | ||
|
|
cc29c25176 | ||
|
|
de1489aabb | ||
|
|
efab98a8f8 | ||
|
|
0b7024c94a | ||
|
|
5250d5c8d6 | ||
|
|
87083cb414 | ||
|
|
251a7b126b | ||
|
|
33e0794da9 | ||
|
|
3ce3793129 | ||
|
|
aa2f3438fa | ||
|
|
24873d0c1d | ||
|
|
83434deb22 | ||
|
|
826889715b | ||
|
|
f8b9e4d780 | ||
|
|
8512904c0a | ||
|
|
cf5649a1df | ||
|
|
fba4192d4b | ||
|
|
16bd0425e0 | ||
|
|
fd750c7c0e | ||
|
|
8112c3aab3 | ||
|
|
8a2a004fb5 | ||
|
|
53042cc9dc | ||
|
|
dd0ea2366f | ||
|
|
18a89b5152 | ||
|
|
19da80d2e4 | ||
|
|
3fe12cd8b5 | ||
|
|
dd1ac4deee | ||
|
|
e4150ff3cb | ||
|
|
caf44207fd | ||
|
|
1ba0c24071 | ||
|
|
21c3edf8d6 | ||
|
|
a7b75c61e8 | ||
|
|
f40aafb89f | ||
|
|
42e060ac74 | ||
|
|
b112d06f66 | ||
|
|
56874bf84b | ||
|
|
d2881bb4a2 | ||
|
|
1401f80081 | ||
|
|
71dbd1d66b | ||
|
|
6e7956b990 | ||
|
|
0469aba90b | ||
|
|
e457ade362 | ||
|
|
6023bda579 | ||
|
|
9e9ba73a43 | ||
|
|
d89474d43b | ||
|
|
b5e6600c73 | ||
|
|
3ad110da33 | ||
|
|
587281a541 | ||
|
|
b6901a49bf | ||
|
|
e1b99a6f39 | ||
|
|
4d78f5f97f | ||
|
|
ab277476a8 | ||
|
|
c95a84c8e5 | ||
|
|
78e10b2da5 | ||
|
|
bf704bd1bc | ||
|
|
b1c0613514 | ||
|
|
db8a60fe6f | ||
|
|
b7cfe89b14 | ||
|
|
4c2c9e4273 | ||
|
|
981b1bd767 | ||
|
|
53c6ddb2ad | ||
|
|
6f78a51da4 | ||
|
|
43af5ceb5e | ||
|
|
c23942ce6f | ||
|
|
8bd7b78825 | ||
|
|
797bb0559a | ||
|
|
dee779179b | ||
|
|
c40baf036c | ||
|
|
d3922a7f5b | ||
|
|
3c189688d0 | ||
|
|
aa399ca91e | ||
|
|
5c23b52c0d | ||
|
|
7bab6cab41 | ||
|
|
9da2a74d9e | ||
|
|
d6ae4d59f0 | ||
|
|
f30070c2c9 | ||
|
|
e1ce98825b | ||
|
|
e8db0176a1 | ||
|
|
6c2d64dcb2 | ||
|
|
8b10059e1b | ||
|
|
16fb4d406b | ||
|
|
8f2dddaa5f | ||
|
|
0249cf3b34 | ||
|
|
9a69cd0b61 | ||
|
|
704b18af30 | ||
|
|
0be700f376 | ||
|
|
8a3f8ef324 | ||
|
|
d4deca45e8 | ||
|
|
15eb96337f | ||
|
|
85d94822b3 | ||
|
|
69a00eaaf6 | ||
|
|
abecdbafc1 | ||
|
|
8f7a82f177 | ||
|
|
4a123a8eac | ||
|
|
ace515eea7 | ||
|
|
b5a1d1a895 | ||
|
|
721a34864f | ||
|
|
e2b2697fcc | ||
|
|
0de8140b3a | ||
|
|
27f542e132 | ||
|
|
897684f995 | ||
|
|
162c6bcaa3 | ||
|
|
82fa71c2cd |
@@ -168,9 +168,25 @@ jobs:
|
||||
image: redis
|
||||
ports:
|
||||
- 6379:6379
|
||||
clickhouse:
|
||||
image: clickhouse/clickhouse-server:latest
|
||||
env:
|
||||
CLICKHOUSE_PASSWORD: clickhousePassword
|
||||
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
|
||||
ports:
|
||||
- 8123:8123
|
||||
- 9000:9000
|
||||
options: >-
|
||||
--health-cmd "clickhouse-client --host=localhost --port=9000 --user=default --password=clickhousePassword --query='SELECT 1'"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
env:
|
||||
NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
|
||||
NODE_ENV: test
|
||||
ANALYTICS_ENABLED: true
|
||||
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
|
||||
CLICKHOUSE_PASSWORD: clickhousePassword
|
||||
steps:
|
||||
- name: Fetch custom Github Actions and base branch history
|
||||
uses: actions/checkout@v4
|
||||
@@ -178,7 +194,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
- name: Install dependencies
|
||||
uses: ./.github/workflows/actions/yarn-install
|
||||
- name: Update .env.test for billing
|
||||
- name: Update .env.test for integrations tests
|
||||
run: |
|
||||
echo "IS_BILLING_ENABLED=true" >> .env.test
|
||||
echo "BILLING_STRIPE_API_KEY=test-api-key" >> .env.test
|
||||
@@ -198,6 +214,10 @@ jobs:
|
||||
- name: Server / Create Test DB
|
||||
run: |
|
||||
PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";'
|
||||
- name: Run ClickHouse migrations
|
||||
run: npx nx clickhouse:migrate twenty-server
|
||||
- name: Run ClickHouse seeds
|
||||
run: npx nx clickhouse:seed twenty-server
|
||||
- name: Server / Run Integration Tests
|
||||
uses: ./.github/workflows/actions/nx-affected
|
||||
with:
|
||||
|
||||
@@ -17,4 +17,7 @@ postgres-on-docker:
|
||||
-c "CREATE DATABASE \"test\" WITH OWNER postgres;"
|
||||
|
||||
redis-on-docker:
|
||||
docker run -d --name twenty_redis -p 6379:6379 redis/redis-stack-server:latest
|
||||
docker run -d --name twenty_redis -p 6379:6379 redis/redis-stack-server:latest
|
||||
|
||||
clickhouse-on-docker:
|
||||
docker run -d --name twenty_clickhouse -p 8123:8123 -p 9000:9000 -e CLICKHOUSE_PASSWORD=devPassword clickhouse/clickhouse-server:latest
|
||||
+5
-1
@@ -99,7 +99,9 @@
|
||||
"graphql-fields": "^2.0.3",
|
||||
"graphql-middleware": "^6.1.35",
|
||||
"graphql-rate-limit": "^3.3.0",
|
||||
"graphql-redis-subscriptions": "^2.7.0",
|
||||
"graphql-scalars": "^1.23.0",
|
||||
"graphql-sse": "^2.5.4",
|
||||
"graphql-subscriptions": "2.0.0",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"graphql-type-json": "^0.3.2",
|
||||
@@ -181,6 +183,7 @@
|
||||
"semver": "^7.5.4",
|
||||
"sharp": "^0.32.1",
|
||||
"slash": "^5.1.0",
|
||||
"storybook-addon-mock-date": "^0.6.0",
|
||||
"stripe": "^17.3.1",
|
||||
"ts-key-enum": "^2.0.12",
|
||||
"tslib": "^2.3.0",
|
||||
@@ -354,7 +357,8 @@
|
||||
"type-fest": "4.10.1",
|
||||
"typescript": "5.3.3",
|
||||
"prosemirror-model": "1.23.0",
|
||||
"yjs": "13.6.18"
|
||||
"yjs": "13.6.18",
|
||||
"graphql-redis-subscriptions/ioredis": "^5.6.0"
|
||||
},
|
||||
"version": "0.2.1",
|
||||
"nx": {},
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
# README
|
||||
DISCLAIMER: The k8s and podman deployments are not maintained by the core team.
|
||||
These files are provided and maintained by the community. Twenty core team
|
||||
maintains support for docker deployment.
|
||||
|
||||
## Overview
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# How to deploy twenty on podman
|
||||
|
||||
DISCLAIMER: The k8s and podman deployments are not maintained by the core team.
|
||||
These files are provided and maintained by the community. Twenty core team
|
||||
maintains support for docker deployment.
|
||||
|
||||
|
||||
## How to use
|
||||
|
||||
1. Edit `.env` file. At the minimum set `POSTGRES_PASSWORD`, `SERVER_URL`, and `APP_SECRET`.
|
||||
2. Start twenty by running `podman-compose up -d`.
|
||||
|
||||
If you need to stop twenty, you can do so by running `podman-compose down`.
|
||||
|
||||
|
||||
### Install systemd service (optional)
|
||||
|
||||
If you want to install a systemd service to run twenty, you can use the provided systemd service.
|
||||
|
||||
Edit `twentycrm.service` and change these two variables:
|
||||
|
||||
|
||||
WorkingDirectory=/opt/apps/twenty
|
||||
EnvironmentFile=/opt/apps/twenty/.env
|
||||
|
||||
`WorkingDirectory` should be changed to the path in which `podman-compose.yml` is located.
|
||||
|
||||
`EnvironmentFile` should be changed to the path in which your `.env`file is located.
|
||||
|
||||
You can run the script `install-systemd-user-service` to install the systemd service under the current user.
|
||||
|
||||
|
||||
./install-systemd-user-service
|
||||
|
||||
Note: this script will enable the service and also start it. So it will assume that twenty is not currently running.
|
||||
If you started it previously, bring it down using:
|
||||
|
||||
podman-compose down
|
||||
|
||||
|
||||
|
||||
## Compatibility
|
||||
|
||||
These files should be compatible with podman 4.3+.
|
||||
|
||||
I have tested this on Debian GNU/Linux 12 (bookworm) and with the podman that is distributed with the official Debian stable mirrors (podman v4.3.1+ds1-8+deb12u1, podman-compose v1.0.3-3).
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
mkdir -p ~/.config/systemd/user
|
||||
[ -f twentycrm.service ] || { echo "Error: twentycrm.service not found"; exit 1; }
|
||||
cp twentycrm.service ~/.config/systemd/user
|
||||
|
||||
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable twentycrm.service
|
||||
systemctl --user start twentycrm.service
|
||||
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
if [ ! -f "$(dirname "$0")/.env" ]; then
|
||||
echo "Error: .env file not found"
|
||||
exit 1
|
||||
fi
|
||||
source "$(dirname "$0")/.env"
|
||||
|
||||
## steps to cleanup and start over from scratch - useful when testing
|
||||
#podman pod stop twenty-pod
|
||||
#podman pod rm twenty-pod
|
||||
#podman volume rm twenty-db-data twenty-server-data twenty-redis-data
|
||||
# end of cleanup
|
||||
|
||||
podman volume create twenty-db-data
|
||||
podman volume create twenty-server-data
|
||||
podman volume create twenty-redis-data
|
||||
|
||||
podman pod create --name twenty-pod -p 127.0.0.1:8080:3000
|
||||
|
||||
podman run -d --pod twenty-pod --name twenty-db \
|
||||
-e POSTGRES_DB=twenty \
|
||||
-e POSTGRES_USER=twenty \
|
||||
-e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
|
||||
-v twenty-db-data:/var/lib/postgresql/data:Z \
|
||||
docker.io/library/postgres:16
|
||||
|
||||
podman run -d --pod twenty-pod --name twenty-redis \
|
||||
-v twenty-redis-data:/data:Z \
|
||||
docker.io/library/redis:latest
|
||||
|
||||
podman run -d --pod twenty-pod --name twenty-server \
|
||||
-e NODE_PORT=3000 \
|
||||
-e SERVER_URL="$SERVER_URL" \
|
||||
-e PG_DATABASE_URL="postgresql://twenty:$POSTGRES_PASSWORD@twenty-db:5432/twenty" \
|
||||
-e REDIS_URL="redis://twenty-redis:6379" \
|
||||
-e APP_SECRET="$APP_SECRET" \
|
||||
-e NODE_ENV=production \
|
||||
-e LOG_LEVEL=info \
|
||||
-v twenty-server-data:/app/docker-data:Z \
|
||||
docker.io/twentycrm/twenty:latest
|
||||
|
||||
podman run -d --pod twenty-pod --name twenty-worker \
|
||||
--init \
|
||||
-e SERVER_URL="$SERVER_URL" \
|
||||
-e PG_DATABASE_URL="postgresql://twenty:$POSTGRES_PASSWORD@twenty-db:5432/twenty" \
|
||||
-e REDIS_URL="redis://twenty-redis:6379" \
|
||||
-e APP_SECRET="$APP_SECRET" \
|
||||
-e DISABLE_DB_MIGRATIONS=true \
|
||||
-e NODE_ENV=production \
|
||||
-e LOG_LEVEL=info \
|
||||
-v twenty-server-data:/app/docker-data:Z \
|
||||
docker.io/twentycrm/twenty:latest \
|
||||
yarn worker:prod
|
||||
|
||||
# wait some time, check status
|
||||
sleep 30
|
||||
podman ps --pod -f name=twenty-pod
|
||||
|
||||
|
||||
mkdir -p ~/.config/systemd/user
|
||||
if [ ! -f "twentycrm.service" ]; then
|
||||
echo "Error: twentycrm.service file not found"
|
||||
exit 1
|
||||
fi
|
||||
cp twentycrm.service ~/.config/systemd/user
|
||||
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable twentycrm.service
|
||||
systemctl --user start twentycrm.service
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
db:
|
||||
container_name: twenty-db
|
||||
image: postgres:16
|
||||
environment:
|
||||
POSTGRES_DB: twenty
|
||||
POSTGRES_USER: twenty
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- twenty-db-data:/var/lib/postgresql/data:Z
|
||||
|
||||
redis:
|
||||
container_name: twenty-redis
|
||||
image: redis:latest
|
||||
volumes:
|
||||
- twenty-redis-data:/data:Z
|
||||
|
||||
server:
|
||||
container_name: twenty-server
|
||||
image: twentycrm/twenty:latest
|
||||
environment:
|
||||
NODE_PORT: "3000"
|
||||
SERVER_URL: ${SERVER_URL}
|
||||
PG_DATABASE_URL: "postgresql://twenty:${POSTGRES_PASSWORD}@twenty-db:5432/twenty"
|
||||
REDIS_URL: "redis://twenty-redis:6379"
|
||||
APP_SECRET: ${APP_SECRET}
|
||||
NODE_ENV: production
|
||||
LOG_LEVEL: info
|
||||
volumes:
|
||||
- twenty-server-data:/app/docker-data:Z
|
||||
ports:
|
||||
- 127.0.0.1:8080:3000
|
||||
|
||||
worker:
|
||||
container_name: twenty-worker
|
||||
image: twentycrm/twenty:latest
|
||||
command: yarn worker:prod
|
||||
environment:
|
||||
SERVER_URL: ${SERVER_URL}
|
||||
PG_DATABASE_URL: "postgresql://twenty:${POSTGRES_PASSWORD}@twenty-db:5432/twenty"
|
||||
REDIS_URL: "redis://twenty-redis:6379"
|
||||
APP_SECRET: ${APP_SECRET}
|
||||
DISABLE_DB_MIGRATIONS: "true"
|
||||
NODE_ENV: production
|
||||
LOG_LEVEL: info
|
||||
volumes:
|
||||
- twenty-server-data:/app/docker-data:Z
|
||||
init: true
|
||||
|
||||
volumes:
|
||||
twenty-db-data:
|
||||
twenty-server-data:
|
||||
twenty-redis-data:
|
||||
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=TwentyCRM Container Stack via Podman-Compose
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/apps/twenty
|
||||
EnvironmentFile=/opt/apps/twenty/.env
|
||||
ExecStart=/usr/bin/podman-compose -f podman-compose.yml up -d
|
||||
ExecStop=/usr/bin/podman-compose -f podman-compose.yml down
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
|
||||
@@ -64,8 +64,6 @@ WORKDIR /app/packages/twenty-server
|
||||
|
||||
ARG REACT_APP_SERVER_BASE_URL
|
||||
ENV REACT_APP_SERVER_BASE_URL $REACT_APP_SERVER_BASE_URL
|
||||
ARG SENTRY_RELEASE
|
||||
ENV SENTRY_RELEASE $SENTRY_RELEASE
|
||||
|
||||
ARG APP_VERSION
|
||||
ENV APP_VERSION $APP_VERSION
|
||||
|
||||
@@ -17,6 +17,7 @@ export class WorkflowVisualizerPage {
|
||||
readonly deactivateWorkflowButton: Locator;
|
||||
readonly addTriggerButton: Locator;
|
||||
readonly commandMenu: Locator;
|
||||
readonly stepHeaderInCommandMenu: Locator;
|
||||
readonly workflowNameLabel: Locator;
|
||||
readonly triggerNode: Locator;
|
||||
readonly background: Locator;
|
||||
@@ -68,6 +69,9 @@ export class WorkflowVisualizerPage {
|
||||
});
|
||||
this.addTriggerButton = page.getByText('Add a Trigger');
|
||||
this.commandMenu = page.getByTestId('command-menu');
|
||||
this.stepHeaderInCommandMenu = this.commandMenu.getByTestId(
|
||||
'workflow-step-header',
|
||||
);
|
||||
this.workflowNameLabel = page
|
||||
.getByTestId('top-bar-title')
|
||||
.getByText(this.workflowName);
|
||||
@@ -114,7 +118,7 @@ export class WorkflowVisualizerPage {
|
||||
.getByTestId(`row-id-${this.workflowId}`)
|
||||
.getByRole('link', { name: this.workflowName });
|
||||
|
||||
await workflowLink.click();
|
||||
await workflowLink.click({ force: true });
|
||||
|
||||
await this.waitForWorkflowVisualizerLoad();
|
||||
}
|
||||
|
||||
@@ -110,6 +110,10 @@ export class SettingsPage {
|
||||
await this.releasesLink.click();
|
||||
}
|
||||
|
||||
async logout() {
|
||||
await this.page.getByText('Logout').click();
|
||||
}
|
||||
|
||||
async toggleAdvancedSettings() {
|
||||
await this.advancedToggle.click();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "twenty-e2e-testing",
|
||||
"version": "0.51.0-canary",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"private": true,
|
||||
|
||||
@@ -10,7 +10,9 @@ test('Create workflow', async ({ page }) => {
|
||||
const workflowsLink = page.getByRole('link', { name: 'Workflows' });
|
||||
await workflowsLink.click();
|
||||
|
||||
const createWorkflowButton = page.getByRole('button', { name: 'New record' });
|
||||
const createWorkflowButton = page.getByRole('button', {
|
||||
name: 'Create new workflow',
|
||||
});
|
||||
|
||||
const [createWorkflowResponse] = await Promise.all([
|
||||
page.waitForResponse(async (response) => {
|
||||
@@ -26,7 +28,7 @@ test('Create workflow', async ({ page }) => {
|
||||
createWorkflowButton.click(),
|
||||
]);
|
||||
|
||||
const recordName = page.getByTestId('top-bar-title').getByTestId('tooltip');
|
||||
const recordName = page.getByTestId('top-bar-title').getByText('Untitled');
|
||||
await recordName.click();
|
||||
|
||||
const nameInput = page.getByTestId('top-bar-title').getByRole('textbox');
|
||||
|
||||
@@ -1,60 +1,58 @@
|
||||
import { expect } from '@playwright/test';
|
||||
import { test } from '../lib/fixtures/blank-workflow';
|
||||
|
||||
test.fixme(
|
||||
'The workflow run visualizer shows the executed draft version without the last draft changes',
|
||||
async ({ workflowVisualizer, page }) => {
|
||||
await workflowVisualizer.createInitialTrigger('manual');
|
||||
test('The workflow run visualizer shows the executed draft version without the last draft changes', async ({
|
||||
workflowVisualizer,
|
||||
page,
|
||||
}) => {
|
||||
await workflowVisualizer.createInitialTrigger('manual');
|
||||
|
||||
const manualTriggerAvailabilitySelect = page.getByRole('button', {
|
||||
name: 'When record(s) are selected',
|
||||
});
|
||||
const manualTriggerAvailabilitySelect = page.getByRole('button', {
|
||||
name: 'When record(s) are selected',
|
||||
});
|
||||
|
||||
await manualTriggerAvailabilitySelect.click();
|
||||
await manualTriggerAvailabilitySelect.click();
|
||||
|
||||
const alwaysAvailableOption = page.getByText(
|
||||
'When no record(s) are selected',
|
||||
);
|
||||
const alwaysAvailableOption = page.getByText(
|
||||
'When no record(s) are selected',
|
||||
);
|
||||
|
||||
await alwaysAvailableOption.click();
|
||||
await alwaysAvailableOption.click();
|
||||
|
||||
await workflowVisualizer.closeSidePanel();
|
||||
await workflowVisualizer.closeSidePanel();
|
||||
|
||||
const { createdStepId: firstStepId } =
|
||||
await workflowVisualizer.createStep('create-record');
|
||||
const { createdStepId: firstStepId } =
|
||||
await workflowVisualizer.createStep('create-record');
|
||||
|
||||
await workflowVisualizer.closeSidePanel();
|
||||
await workflowVisualizer.closeSidePanel();
|
||||
|
||||
const launchTestButton = page.getByLabel('Test Workflow');
|
||||
const launchTestButton = page.getByLabel(workflowVisualizer.workflowName);
|
||||
|
||||
await launchTestButton.click();
|
||||
await launchTestButton.click();
|
||||
|
||||
const goToExecutionPageLink = page.getByRole('link', {
|
||||
name: 'View execution details',
|
||||
});
|
||||
const executionPageUrl = await goToExecutionPageLink.getAttribute('href');
|
||||
expect(executionPageUrl).not.toBeNull();
|
||||
const goToExecutionPageLink = page.getByRole('link', {
|
||||
name: 'View execution details',
|
||||
});
|
||||
const executionPageUrl = await goToExecutionPageLink.getAttribute('href');
|
||||
expect(executionPageUrl).not.toBeNull();
|
||||
|
||||
await workflowVisualizer.deleteStep(firstStepId);
|
||||
await workflowVisualizer.deleteStep(firstStepId);
|
||||
|
||||
await page.goto(executionPageUrl!);
|
||||
await page.goto(executionPageUrl!);
|
||||
|
||||
const workflowRunName = page.getByText('Execution of v1');
|
||||
const workflowRunName = page
|
||||
.getByText(`#1 - ${workflowVisualizer.workflowName}`)
|
||||
.nth(1);
|
||||
|
||||
await expect(workflowRunName).toBeVisible();
|
||||
await expect(workflowRunName).toBeVisible();
|
||||
|
||||
const flowTab = page.getByText('Flow', { exact: true });
|
||||
const executedFirstStepNode = workflowVisualizer.getStepNode(firstStepId);
|
||||
|
||||
await flowTab.click();
|
||||
await expect(executedFirstStepNode).toBeVisible();
|
||||
|
||||
const executedFirstStepNode = workflowVisualizer.getStepNode(firstStepId);
|
||||
await executedFirstStepNode.click();
|
||||
|
||||
await expect(executedFirstStepNode).toBeVisible();
|
||||
|
||||
await executedFirstStepNode.click();
|
||||
|
||||
await expect(
|
||||
workflowVisualizer.commandMenu.getByRole('textbox').first(),
|
||||
).toHaveValue('Create Record');
|
||||
},
|
||||
);
|
||||
await expect(workflowVisualizer.stepHeaderInCommandMenu).toContainText(
|
||||
'Create Record',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -57,7 +57,7 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
|
||||
},
|
||||
);
|
||||
|
||||
await linkToFirstWorkflowVersion.click();
|
||||
await linkToFirstWorkflowVersion.click({ force: true });
|
||||
|
||||
await expect(workflowVisualizer.workflowStatus).toHaveText('Archived');
|
||||
await expect(workflowVisualizer.useAsDraftButton).toBeVisible();
|
||||
@@ -139,7 +139,7 @@ test('Use an old version as draft while having a pending draft version', async (
|
||||
},
|
||||
);
|
||||
|
||||
await linkToFirstWorkflowVersion.click();
|
||||
await linkToFirstWorkflowVersion.click({ force: true });
|
||||
|
||||
await expect(workflowVisualizer.workflowStatus).toHaveText('Active');
|
||||
await expect(workflowVisualizer.useAsDraftButton).toBeVisible();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "twenty-emails",
|
||||
"version": "0.51.0-canary",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"private": true,
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
const path = require('path');
|
||||
|
||||
module.exports = {
|
||||
extends: ['../../.eslintrc.react.cjs'],
|
||||
ignorePatterns: [
|
||||
|
||||
@@ -48,6 +48,7 @@ const config: StorybookConfig = {
|
||||
'storybook-dark-mode',
|
||||
'storybook-addon-cookie',
|
||||
'storybook-addon-pseudo-states',
|
||||
'storybook-addon-mock-date'
|
||||
],
|
||||
framework: {
|
||||
name: '@storybook/react-vite',
|
||||
|
||||
@@ -8,6 +8,7 @@ import { RootDecorator } from '../src/testing/decorators/RootDecorator';
|
||||
import { mockedUserJWT } from '../src/testing/mock-data/jwt';
|
||||
|
||||
import 'react-loading-skeleton/dist/skeleton.css';
|
||||
import 'twenty-ui/style.css';
|
||||
import { THEME_DARK, THEME_LIGHT, ThemeContextProvider } from 'twenty-ui/theme';
|
||||
|
||||
initialize({
|
||||
@@ -61,6 +62,7 @@ const preview: Preview = {
|
||||
date: /Date$/,
|
||||
},
|
||||
},
|
||||
mockingDate: new Date('2024-03-12T09:30:00.000Z'),
|
||||
options: {
|
||||
storySort: {
|
||||
order: ['UI', 'Modules', 'Pages'],
|
||||
|
||||
@@ -12,7 +12,6 @@ module.exports = {
|
||||
'!./src/**/*.test.tsx',
|
||||
'!./src/**/*.stories.tsx',
|
||||
'!./src/**/__mocks__/*.ts',
|
||||
'!./src/modules/users/graphql/queries/getCurrentUserAndViews.ts',
|
||||
],
|
||||
overwrite: true,
|
||||
generates: {
|
||||
|
||||
@@ -69,6 +69,7 @@ const jestConfig: JestConfigWithTsJest = {
|
||||
'config/*',
|
||||
'graphql/queries/*',
|
||||
'graphql/mutations/*',
|
||||
'graphql/subscriptions/*',
|
||||
'graphql/fragments/*',
|
||||
'types/*',
|
||||
'constants/*',
|
||||
|
||||
@@ -9,7 +9,7 @@ const globalCoverage = {
|
||||
|
||||
const modulesCoverage = {
|
||||
branches: 25,
|
||||
statements: 44,
|
||||
statements: 43,
|
||||
lines: 44,
|
||||
functions: 38,
|
||||
include: ['src/modules/**/*'],
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "twenty-front",
|
||||
"version": "0.51.0-canary",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
@@ -54,7 +53,6 @@
|
||||
"buffer": "^6.0.3",
|
||||
"docx": "^9.1.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"recoil-sync": "^0.2.0",
|
||||
"transliteration": "^2.3.5",
|
||||
"twenty-shared": "workspace:*",
|
||||
"twenty-ui": "workspace:*"
|
||||
|
||||
@@ -63,6 +63,11 @@ export type Analytics = {
|
||||
success: Scalars['Boolean']['output'];
|
||||
};
|
||||
|
||||
export enum AnalyticsType {
|
||||
PAGEVIEW = 'PAGEVIEW',
|
||||
TRACK = 'TRACK'
|
||||
}
|
||||
|
||||
export type ApiConfig = {
|
||||
__typename?: 'ApiConfig';
|
||||
mutationMaximumAffectedRecords: Scalars['Float']['output'];
|
||||
@@ -155,7 +160,8 @@ export type BillingEndTrialPeriodOutput = {
|
||||
|
||||
export type BillingMeteredProductUsageOutput = {
|
||||
__typename?: 'BillingMeteredProductUsageOutput';
|
||||
includedFreeQuantity: Scalars['Float']['output'];
|
||||
freeTierQuantity: Scalars['Float']['output'];
|
||||
freeTrialQuantity: Scalars['Float']['output'];
|
||||
periodEnd: Scalars['DateTime']['output'];
|
||||
periodStart: Scalars['DateTime']['output'];
|
||||
productKey: BillingProductKey;
|
||||
@@ -474,6 +480,10 @@ export type CreateServerlessFunctionInput = {
|
||||
};
|
||||
|
||||
export type CreateWorkflowVersionStepInput = {
|
||||
/** Next step ID */
|
||||
nextStepId?: InputMaybe<Scalars['String']['input']>;
|
||||
/** Parent step ID */
|
||||
parentStepId?: InputMaybe<Scalars['String']['input']>;
|
||||
/** New step type */
|
||||
stepType: Scalars['String']['input'];
|
||||
/** Workflow version ID */
|
||||
@@ -598,6 +608,12 @@ export type FeatureFlag = {
|
||||
workspaceId: Scalars['String']['output'];
|
||||
};
|
||||
|
||||
export type FeatureFlagDto = {
|
||||
__typename?: 'FeatureFlagDTO';
|
||||
key: FeatureFlagKey;
|
||||
value: Scalars['Boolean']['output'];
|
||||
};
|
||||
|
||||
export enum FeatureFlagKey {
|
||||
IsAirtableIntegrationEnabled = 'IsAirtableIntegrationEnabled',
|
||||
IsAnalyticsV2Enabled = 'IsAnalyticsV2Enabled',
|
||||
@@ -606,7 +622,6 @@ export enum FeatureFlagKey {
|
||||
IsCustomDomainEnabled = 'IsCustomDomainEnabled',
|
||||
IsEventObjectEnabled = 'IsEventObjectEnabled',
|
||||
IsJsonFilterEnabled = 'IsJsonFilterEnabled',
|
||||
IsMeteredProductBillingEnabled = 'IsMeteredProductBillingEnabled',
|
||||
IsNewRelationEnabled = 'IsNewRelationEnabled',
|
||||
IsPermissionsV2Enabled = 'IsPermissionsV2Enabled',
|
||||
IsPostgreSQLIntegrationEnabled = 'IsPostgreSQLIntegrationEnabled',
|
||||
@@ -971,8 +986,9 @@ export type Mutation = {
|
||||
syncRemoteTable: RemoteTable;
|
||||
syncRemoteTableSchemaChanges: RemoteTable;
|
||||
track: Analytics;
|
||||
trackAnalytics: Analytics;
|
||||
unsyncRemoteTable: RemoteTable;
|
||||
updateLabPublicFeatureFlag: FeatureFlag;
|
||||
updateLabPublicFeatureFlag: FeatureFlagDto;
|
||||
updateOneField: Field;
|
||||
updateOneObject: Object;
|
||||
updateOneRemoteServer: RemoteServer;
|
||||
@@ -1253,6 +1269,14 @@ export type MutationTrackArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type MutationTrackAnalyticsArgs = {
|
||||
event?: InputMaybe<Scalars['String']['input']>;
|
||||
name?: InputMaybe<Scalars['String']['input']>;
|
||||
properties?: InputMaybe<Scalars['JSON']['input']>;
|
||||
type: AnalyticsType;
|
||||
};
|
||||
|
||||
|
||||
export type MutationUnsyncRemoteTableArgs = {
|
||||
input: RemoteTableInput;
|
||||
};
|
||||
@@ -1892,6 +1916,7 @@ export type Role = {
|
||||
id: Scalars['String']['output'];
|
||||
isEditable: Scalars['Boolean']['output'];
|
||||
label: Scalars['String']['output'];
|
||||
objectPermissions?: Maybe<Array<ObjectPermission>>;
|
||||
settingPermissions?: Maybe<Array<SettingPermission>>;
|
||||
workspaceMembers: Array<WorkspaceMember>;
|
||||
};
|
||||
@@ -2462,7 +2487,7 @@ export type Workspace = {
|
||||
defaultRole?: Maybe<Role>;
|
||||
deletedAt?: Maybe<Scalars['DateTime']['output']>;
|
||||
displayName?: Maybe<Scalars['String']['output']>;
|
||||
featureFlags?: Maybe<Array<FeatureFlag>>;
|
||||
featureFlags?: Maybe<Array<FeatureFlagDto>>;
|
||||
hasValidEnterpriseKey: Scalars['Boolean']['output'];
|
||||
id: Scalars['UUID']['output'];
|
||||
inviteHash?: Maybe<Scalars['String']['output']>;
|
||||
|
||||
@@ -55,6 +55,11 @@ export type Analytics = {
|
||||
success: Scalars['Boolean'];
|
||||
};
|
||||
|
||||
export enum AnalyticsType {
|
||||
PAGEVIEW = 'PAGEVIEW',
|
||||
TRACK = 'TRACK'
|
||||
}
|
||||
|
||||
export type ApiConfig = {
|
||||
__typename?: 'ApiConfig';
|
||||
mutationMaximumAffectedRecords: Scalars['Float'];
|
||||
@@ -147,7 +152,8 @@ export type BillingEndTrialPeriodOutput = {
|
||||
|
||||
export type BillingMeteredProductUsageOutput = {
|
||||
__typename?: 'BillingMeteredProductUsageOutput';
|
||||
includedFreeQuantity: Scalars['Float'];
|
||||
freeTierQuantity: Scalars['Float'];
|
||||
freeTrialQuantity: Scalars['Float'];
|
||||
periodEnd: Scalars['DateTime'];
|
||||
periodStart: Scalars['DateTime'];
|
||||
productKey: BillingProductKey;
|
||||
@@ -410,6 +416,10 @@ export type CreateServerlessFunctionInput = {
|
||||
};
|
||||
|
||||
export type CreateWorkflowVersionStepInput = {
|
||||
/** Next step ID */
|
||||
nextStepId?: InputMaybe<Scalars['String']>;
|
||||
/** Parent step ID */
|
||||
parentStepId?: InputMaybe<Scalars['String']>;
|
||||
/** New step type */
|
||||
stepType: Scalars['String'];
|
||||
/** Workflow version ID */
|
||||
@@ -443,6 +453,15 @@ export type CustomDomainValidRecords = {
|
||||
records: Array<CustomDomainRecord>;
|
||||
};
|
||||
|
||||
/** Database Event Action */
|
||||
export enum DatabaseEventAction {
|
||||
CREATED = 'CREATED',
|
||||
DELETED = 'DELETED',
|
||||
DESTROYED = 'DESTROYED',
|
||||
RESTORED = 'RESTORED',
|
||||
UPDATED = 'UPDATED'
|
||||
}
|
||||
|
||||
export type DateFilter = {
|
||||
eq?: InputMaybe<Scalars['Date']>;
|
||||
gt?: InputMaybe<Scalars['Date']>;
|
||||
@@ -529,6 +548,12 @@ export type FeatureFlag = {
|
||||
workspaceId: Scalars['String'];
|
||||
};
|
||||
|
||||
export type FeatureFlagDto = {
|
||||
__typename?: 'FeatureFlagDTO';
|
||||
key: FeatureFlagKey;
|
||||
value: Scalars['Boolean'];
|
||||
};
|
||||
|
||||
export enum FeatureFlagKey {
|
||||
IsAirtableIntegrationEnabled = 'IsAirtableIntegrationEnabled',
|
||||
IsAnalyticsV2Enabled = 'IsAnalyticsV2Enabled',
|
||||
@@ -537,7 +562,6 @@ export enum FeatureFlagKey {
|
||||
IsCustomDomainEnabled = 'IsCustomDomainEnabled',
|
||||
IsEventObjectEnabled = 'IsEventObjectEnabled',
|
||||
IsJsonFilterEnabled = 'IsJsonFilterEnabled',
|
||||
IsMeteredProductBillingEnabled = 'IsMeteredProductBillingEnabled',
|
||||
IsNewRelationEnabled = 'IsNewRelationEnabled',
|
||||
IsPermissionsV2Enabled = 'IsPermissionsV2Enabled',
|
||||
IsPostgreSQLIntegrationEnabled = 'IsPostgreSQLIntegrationEnabled',
|
||||
@@ -889,7 +913,8 @@ export type Mutation = {
|
||||
submitFormStep: Scalars['Boolean'];
|
||||
switchToYearlyInterval: BillingUpdateOutput;
|
||||
track: Analytics;
|
||||
updateLabPublicFeatureFlag: FeatureFlag;
|
||||
trackAnalytics: Analytics;
|
||||
updateLabPublicFeatureFlag: FeatureFlagDto;
|
||||
updateOneField: Field;
|
||||
updateOneObject: Object;
|
||||
updateOneRole: Role;
|
||||
@@ -1129,6 +1154,14 @@ export type MutationTrackArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type MutationTrackAnalyticsArgs = {
|
||||
event?: InputMaybe<Scalars['String']>;
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
properties?: InputMaybe<Scalars['JSON']>;
|
||||
type: AnalyticsType;
|
||||
};
|
||||
|
||||
|
||||
export type MutationUpdateLabPublicFeatureFlagArgs = {
|
||||
input: UpdateLabPublicFeatureFlagInput;
|
||||
};
|
||||
@@ -1342,6 +1375,21 @@ export type ObjectStandardOverrides = {
|
||||
translations?: Maybe<Scalars['JSON']>;
|
||||
};
|
||||
|
||||
export type OnDbEventDto = {
|
||||
__typename?: 'OnDbEventDTO';
|
||||
action: DatabaseEventAction;
|
||||
eventDate: Scalars['DateTime'];
|
||||
objectNameSingular: Scalars['String'];
|
||||
record: Scalars['JSON'];
|
||||
updatedFields?: Maybe<Array<Scalars['String']>>;
|
||||
};
|
||||
|
||||
export type OnDbEventInput = {
|
||||
action?: InputMaybe<DatabaseEventAction>;
|
||||
objectNameSingular?: InputMaybe<Scalars['String']>;
|
||||
recordId?: InputMaybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
/** Onboarding status */
|
||||
export enum OnboardingStatus {
|
||||
COMPLETED = 'COMPLETED',
|
||||
@@ -1687,6 +1735,7 @@ export type Role = {
|
||||
id: Scalars['String'];
|
||||
isEditable: Scalars['Boolean'];
|
||||
label: Scalars['String'];
|
||||
objectPermissions?: Maybe<Array<ObjectPermission>>;
|
||||
settingPermissions?: Maybe<Array<SettingPermission>>;
|
||||
workspaceMembers: Array<WorkspaceMember>;
|
||||
};
|
||||
@@ -1860,6 +1909,16 @@ export type SubmitFormStepInput = {
|
||||
workflowRunId: Scalars['String'];
|
||||
};
|
||||
|
||||
export type Subscription = {
|
||||
__typename?: 'Subscription';
|
||||
onDbEvent: OnDbEventDto;
|
||||
};
|
||||
|
||||
|
||||
export type SubscriptionOnDbEventArgs = {
|
||||
input: OnDbEventInput;
|
||||
};
|
||||
|
||||
export enum SubscriptionInterval {
|
||||
Day = 'Day',
|
||||
Month = 'Month',
|
||||
@@ -2239,7 +2298,7 @@ export type Workspace = {
|
||||
defaultRole?: Maybe<Role>;
|
||||
deletedAt?: Maybe<Scalars['DateTime']>;
|
||||
displayName?: Maybe<Scalars['String']>;
|
||||
featureFlags?: Maybe<Array<FeatureFlag>>;
|
||||
featureFlags?: Maybe<Array<FeatureFlagDto>>;
|
||||
hasValidEnterpriseKey: Scalars['Boolean'];
|
||||
id: Scalars['UUID'];
|
||||
inviteHash?: Maybe<Scalars['String']>;
|
||||
@@ -2392,6 +2451,16 @@ export type GetTimelineThreadsFromPersonIdQueryVariables = Exact<{
|
||||
|
||||
export type GetTimelineThreadsFromPersonIdQuery = { __typename?: 'Query', getTimelineThreadsFromPersonId: { __typename?: 'TimelineThreadsWithTotal', totalNumberOfThreads: number, timelineThreads: Array<{ __typename?: 'TimelineThread', id: any, read: boolean, visibility: MessageChannelVisibility, lastMessageReceivedAt: string, lastMessageBody: string, subject: string, numberOfMessagesInThread: number, participantCount: number, firstParticipant: { __typename?: 'TimelineThreadParticipant', personId?: any | null, workspaceMemberId?: any | null, firstName: string, lastName: string, displayName: string, avatarUrl: string, handle: string }, lastTwoParticipants: Array<{ __typename?: 'TimelineThreadParticipant', personId?: any | null, workspaceMemberId?: any | null, firstName: string, lastName: string, displayName: string, avatarUrl: string, handle: string }> }> } };
|
||||
|
||||
export type TrackAnalyticsMutationVariables = Exact<{
|
||||
type: AnalyticsType;
|
||||
event?: InputMaybe<Scalars['String']>;
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
properties?: InputMaybe<Scalars['JSON']>;
|
||||
}>;
|
||||
|
||||
|
||||
export type TrackAnalyticsMutation = { __typename?: 'Mutation', trackAnalytics: { __typename?: 'Analytics', success: boolean } };
|
||||
|
||||
export type TrackMutationVariables = Exact<{
|
||||
action: Scalars['String'];
|
||||
payload: Scalars['JSON'];
|
||||
@@ -2581,7 +2650,7 @@ export type EndSubscriptionTrialPeriodMutation = { __typename?: 'Mutation', endS
|
||||
export type GetMeteredProductsUsageQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
export type GetMeteredProductsUsageQuery = { __typename?: 'Query', getMeteredProductsUsage: Array<{ __typename?: 'BillingMeteredProductUsageOutput', productKey: BillingProductKey, usageQuantity: number, includedFreeQuantity: number, unitPriceCents: number, totalCostCents: number }> };
|
||||
export type GetMeteredProductsUsageQuery = { __typename?: 'Query', getMeteredProductsUsage: Array<{ __typename?: 'BillingMeteredProductUsageOutput', productKey: BillingProductKey, usageQuantity: number, freeTierQuantity: number, freeTrialQuantity: number, unitPriceCents: number, totalCostCents: number }> };
|
||||
|
||||
export type SwitchSubscriptionToYearlyIntervalMutationVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
@@ -2660,7 +2729,9 @@ export type UpdateLabPublicFeatureFlagMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type UpdateLabPublicFeatureFlagMutation = { __typename?: 'Mutation', updateLabPublicFeatureFlag: { __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean } };
|
||||
export type UpdateLabPublicFeatureFlagMutation = { __typename?: 'Mutation', updateLabPublicFeatureFlag: { __typename?: 'FeatureFlagDTO', key: FeatureFlagKey, value: boolean } };
|
||||
|
||||
export type ObjectPermissionFragmentFragment = { __typename?: 'ObjectPermission', id: string, objectMetadataId: string, roleId: string, canReadObjectRecords?: boolean | null, canUpdateObjectRecords?: boolean | null, canSoftDeleteObjectRecords?: boolean | null, canDestroyObjectRecords?: boolean | null };
|
||||
|
||||
export type RoleFragmentFragment = { __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean };
|
||||
|
||||
@@ -2698,7 +2769,7 @@ export type UpsertSettingPermissionsMutation = { __typename?: 'Mutation', upsert
|
||||
export type GetRolesQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
export type GetRolesQuery = { __typename?: 'Query', getRoles: Array<{ __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean, workspaceMembers: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }>, settingPermissions?: Array<{ __typename?: 'SettingPermission', id: string, setting: SettingPermissionType, roleId: string }> | null }> };
|
||||
export type GetRolesQuery = { __typename?: 'Query', getRoles: Array<{ __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean, workspaceMembers: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }>, settingPermissions?: Array<{ __typename?: 'SettingPermission', id: string, setting: SettingPermissionType, roleId: string }> | null, objectPermissions?: Array<{ __typename?: 'ObjectPermission', id: string, objectMetadataId: string, roleId: string, canReadObjectRecords?: boolean | null, canUpdateObjectRecords?: boolean | null, canSoftDeleteObjectRecords?: boolean | null, canDestroyObjectRecords?: boolean | null }> | null }> };
|
||||
|
||||
export type CreateApprovedAccessDomainMutationVariables = Exact<{
|
||||
input: CreateApprovedAccessDomainInput;
|
||||
@@ -2759,7 +2830,14 @@ export type GetSsoIdentityProvidersQueryVariables = Exact<{ [key: string]: never
|
||||
|
||||
export type GetSsoIdentityProvidersQuery = { __typename?: 'Query', getSSOIdentityProviders: Array<{ __typename?: 'FindAvailableSSOIDPOutput', type: IdentityProviderType, id: string, name: string, issuer: string, status: SsoIdentityProviderStatus }> };
|
||||
|
||||
export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canAccessFullAdminPanel: boolean, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array<SettingPermissionType> | null, objectRecordsPermissions?: Array<PermissionsOnAllObjectRecords> | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, isCustomDomainEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null, billingSubscriptionItems?: Array<{ __typename?: 'BillingSubscriptionItem', id: any, hasReachedCurrentPeriodCap: boolean, billingProduct?: { __typename?: 'BillingProduct', name: string, description: string, metadata: { __typename?: 'BillingProductMetadata', planKey: BillingPlanKey, priceUsageBased: BillingUsageType, productKey: BillingProductKey } } | null }> | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }>, defaultRole?: { __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean } | null } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> };
|
||||
export type OnDbEventSubscriptionVariables = Exact<{
|
||||
input: OnDbEventInput;
|
||||
}>;
|
||||
|
||||
|
||||
export type OnDbEventSubscription = { __typename?: 'Subscription', onDbEvent: { __typename?: 'OnDbEventDTO', eventDate: string, action: DatabaseEventAction, objectNameSingular: string, updatedFields?: Array<string> | null, record: any } };
|
||||
|
||||
export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canAccessFullAdminPanel: boolean, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array<SettingPermissionType> | null, objectRecordsPermissions?: Array<PermissionsOnAllObjectRecords> | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, isCustomDomainEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlagDTO', key: FeatureFlagKey, value: boolean }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null, billingSubscriptionItems?: Array<{ __typename?: 'BillingSubscriptionItem', id: any, hasReachedCurrentPeriodCap: boolean, billingProduct?: { __typename?: 'BillingProduct', name: string, description: string, metadata: { __typename?: 'BillingProductMetadata', planKey: BillingPlanKey, priceUsageBased: BillingUsageType, productKey: BillingProductKey } } | null }> | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }>, defaultRole?: { __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean } | null } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> };
|
||||
|
||||
export type DeleteUserAccountMutationVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
@@ -2776,7 +2854,7 @@ export type UploadProfilePictureMutation = { __typename?: 'Mutation', uploadProf
|
||||
export type GetCurrentUserQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canAccessFullAdminPanel: boolean, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array<SettingPermissionType> | null, objectRecordsPermissions?: Array<PermissionsOnAllObjectRecords> | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, isCustomDomainEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null, billingSubscriptionItems?: Array<{ __typename?: 'BillingSubscriptionItem', id: any, hasReachedCurrentPeriodCap: boolean, billingProduct?: { __typename?: 'BillingProduct', name: string, description: string, metadata: { __typename?: 'BillingProductMetadata', planKey: BillingPlanKey, priceUsageBased: BillingUsageType, productKey: BillingProductKey } } | null }> | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }>, defaultRole?: { __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean } | null } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> } };
|
||||
export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canAccessFullAdminPanel: boolean, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array<SettingPermissionType> | null, objectRecordsPermissions?: Array<PermissionsOnAllObjectRecords> | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, isCustomDomainEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlagDTO', key: FeatureFlagKey, value: boolean }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null, billingSubscriptionItems?: Array<{ __typename?: 'BillingSubscriptionItem', id: any, hasReachedCurrentPeriodCap: boolean, billingProduct?: { __typename?: 'BillingProduct', name: string, description: string, metadata: { __typename?: 'BillingProductMetadata', planKey: BillingPlanKey, priceUsageBased: BillingUsageType, productKey: BillingProductKey } } | null }> | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }>, defaultRole?: { __typename?: 'Role', id: string, label: string, description?: string | null, icon?: string | null, canUpdateAllSettings: boolean, isEditable: boolean, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean } | null } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'WorkspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> } };
|
||||
|
||||
export type ActivateWorkflowVersionMutationVariables = Exact<{
|
||||
workflowVersionId: Scalars['String'];
|
||||
@@ -3013,6 +3091,17 @@ export const AvailableSsoIdentityProvidersFragmentFragmentDoc = gql`
|
||||
}
|
||||
}
|
||||
`;
|
||||
export const ObjectPermissionFragmentFragmentDoc = gql`
|
||||
fragment ObjectPermissionFragment on ObjectPermission {
|
||||
id
|
||||
objectMetadataId
|
||||
roleId
|
||||
canReadObjectRecords
|
||||
canUpdateObjectRecords
|
||||
canSoftDeleteObjectRecords
|
||||
canDestroyObjectRecords
|
||||
}
|
||||
`;
|
||||
export const SettingPermissionFragmentFragmentDoc = gql`
|
||||
fragment SettingPermissionFragment on SettingPermission {
|
||||
id
|
||||
@@ -3090,10 +3179,8 @@ export const UserQueryFragmentFragmentDoc = gql`
|
||||
customUrl
|
||||
}
|
||||
featureFlags {
|
||||
id
|
||||
key
|
||||
value
|
||||
workspaceId
|
||||
}
|
||||
metadataVersion
|
||||
currentBillingSubscription {
|
||||
@@ -3304,6 +3391,42 @@ export function useGetTimelineThreadsFromPersonIdLazyQuery(baseOptions?: Apollo.
|
||||
export type GetTimelineThreadsFromPersonIdQueryHookResult = ReturnType<typeof useGetTimelineThreadsFromPersonIdQuery>;
|
||||
export type GetTimelineThreadsFromPersonIdLazyQueryHookResult = ReturnType<typeof useGetTimelineThreadsFromPersonIdLazyQuery>;
|
||||
export type GetTimelineThreadsFromPersonIdQueryResult = Apollo.QueryResult<GetTimelineThreadsFromPersonIdQuery, GetTimelineThreadsFromPersonIdQueryVariables>;
|
||||
export const TrackAnalyticsDocument = gql`
|
||||
mutation TrackAnalytics($type: AnalyticsType!, $event: String, $name: String, $properties: JSON) {
|
||||
trackAnalytics(type: $type, event: $event, name: $name, properties: $properties) {
|
||||
success
|
||||
}
|
||||
}
|
||||
`;
|
||||
export type TrackAnalyticsMutationFn = Apollo.MutationFunction<TrackAnalyticsMutation, TrackAnalyticsMutationVariables>;
|
||||
|
||||
/**
|
||||
* __useTrackAnalyticsMutation__
|
||||
*
|
||||
* To run a mutation, you first call `useTrackAnalyticsMutation` within a React component and pass it any options that fit your needs.
|
||||
* When your component renders, `useTrackAnalyticsMutation` returns a tuple that includes:
|
||||
* - A mutate function that you can call at any time to execute the mutation
|
||||
* - An object with fields that represent the current status of the mutation's execution
|
||||
*
|
||||
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
|
||||
*
|
||||
* @example
|
||||
* const [trackAnalyticsMutation, { data, loading, error }] = useTrackAnalyticsMutation({
|
||||
* variables: {
|
||||
* type: // value for 'type'
|
||||
* event: // value for 'event'
|
||||
* name: // value for 'name'
|
||||
* properties: // value for 'properties'
|
||||
* },
|
||||
* });
|
||||
*/
|
||||
export function useTrackAnalyticsMutation(baseOptions?: Apollo.MutationHookOptions<TrackAnalyticsMutation, TrackAnalyticsMutationVariables>) {
|
||||
const options = {...defaultOptions, ...baseOptions}
|
||||
return Apollo.useMutation<TrackAnalyticsMutation, TrackAnalyticsMutationVariables>(TrackAnalyticsDocument, options);
|
||||
}
|
||||
export type TrackAnalyticsMutationHookResult = ReturnType<typeof useTrackAnalyticsMutation>;
|
||||
export type TrackAnalyticsMutationResult = Apollo.MutationResult<TrackAnalyticsMutation>;
|
||||
export type TrackAnalyticsMutationOptions = Apollo.BaseMutationOptions<TrackAnalyticsMutation, TrackAnalyticsMutationVariables>;
|
||||
export const TrackDocument = gql`
|
||||
mutation Track($action: String!, $payload: JSON!) {
|
||||
track(action: $action, payload: $payload) {
|
||||
@@ -4248,7 +4371,8 @@ export const GetMeteredProductsUsageDocument = gql`
|
||||
getMeteredProductsUsage {
|
||||
productKey
|
||||
usageQuantity
|
||||
includedFreeQuantity
|
||||
freeTierQuantity
|
||||
freeTrialQuantity
|
||||
unitPriceCents
|
||||
totalCostCents
|
||||
}
|
||||
@@ -4796,7 +4920,6 @@ export type GetSystemHealthStatusQueryResult = Apollo.QueryResult<GetSystemHealt
|
||||
export const UpdateLabPublicFeatureFlagDocument = gql`
|
||||
mutation UpdateLabPublicFeatureFlag($input: UpdateLabPublicFeatureFlagInput!) {
|
||||
updateLabPublicFeatureFlag(input: $input) {
|
||||
id
|
||||
key
|
||||
value
|
||||
}
|
||||
@@ -4980,11 +5103,15 @@ export const GetRolesDocument = gql`
|
||||
settingPermissions {
|
||||
...SettingPermissionFragment
|
||||
}
|
||||
objectPermissions {
|
||||
...ObjectPermissionFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${RoleFragmentFragmentDoc}
|
||||
${WorkspaceMemberQueryFragmentFragmentDoc}
|
||||
${SettingPermissionFragmentFragmentDoc}`;
|
||||
${SettingPermissionFragmentFragmentDoc}
|
||||
${ObjectPermissionFragmentFragmentDoc}`;
|
||||
|
||||
/**
|
||||
* __useGetRolesQuery__
|
||||
@@ -5334,6 +5461,40 @@ export function useGetSsoIdentityProvidersLazyQuery(baseOptions?: Apollo.LazyQue
|
||||
export type GetSsoIdentityProvidersQueryHookResult = ReturnType<typeof useGetSsoIdentityProvidersQuery>;
|
||||
export type GetSsoIdentityProvidersLazyQueryHookResult = ReturnType<typeof useGetSsoIdentityProvidersLazyQuery>;
|
||||
export type GetSsoIdentityProvidersQueryResult = Apollo.QueryResult<GetSsoIdentityProvidersQuery, GetSsoIdentityProvidersQueryVariables>;
|
||||
export const OnDbEventDocument = gql`
|
||||
subscription OnDbEvent($input: OnDbEventInput!) {
|
||||
onDbEvent(input: $input) {
|
||||
eventDate
|
||||
action
|
||||
objectNameSingular
|
||||
updatedFields
|
||||
record
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
/**
|
||||
* __useOnDbEventSubscription__
|
||||
*
|
||||
* To run a query within a React component, call `useOnDbEventSubscription` and pass it any options that fit your needs.
|
||||
* When your component renders, `useOnDbEventSubscription` returns an object from Apollo Client that contains loading, error, and data properties
|
||||
* you can use to render your UI.
|
||||
*
|
||||
* @param baseOptions options that will be passed into the subscription, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||
*
|
||||
* @example
|
||||
* const { data, loading, error } = useOnDbEventSubscription({
|
||||
* variables: {
|
||||
* input: // value for 'input'
|
||||
* },
|
||||
* });
|
||||
*/
|
||||
export function useOnDbEventSubscription(baseOptions: Apollo.SubscriptionHookOptions<OnDbEventSubscription, OnDbEventSubscriptionVariables>) {
|
||||
const options = {...defaultOptions, ...baseOptions}
|
||||
return Apollo.useSubscription<OnDbEventSubscription, OnDbEventSubscriptionVariables>(OnDbEventDocument, options);
|
||||
}
|
||||
export type OnDbEventSubscriptionHookResult = ReturnType<typeof useOnDbEventSubscription>;
|
||||
export type OnDbEventSubscriptionResult = Apollo.SubscriptionResult<OnDbEventSubscription>;
|
||||
export const DeleteUserAccountDocument = gql`
|
||||
mutation DeleteUserAccount {
|
||||
deleteUser {
|
||||
|
||||
@@ -2,27 +2,31 @@ import { matchPath, useLocation } from 'react-router-dom';
|
||||
|
||||
import { AppBasePath } from '@/types/AppBasePath';
|
||||
import { isNonEmptyString } from '@sniptt/guards';
|
||||
import { useCallback } from 'react';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
const addTrailingSlash = (path: string) =>
|
||||
path.endsWith('/') ? path : path + '/';
|
||||
|
||||
const getConstructedPath = (path: string, basePath?: AppBasePath) => {
|
||||
if (!isNonEmptyString(basePath)) return path;
|
||||
|
||||
return addTrailingSlash(basePath) + path;
|
||||
};
|
||||
|
||||
export const useIsMatchingLocation = () => {
|
||||
const location = useLocation();
|
||||
|
||||
const addTrailingSlash = (path: string) =>
|
||||
path.endsWith('/') ? path : path + '/';
|
||||
|
||||
const getConstructedPath = (path: string, basePath?: AppBasePath) => {
|
||||
if (!isNonEmptyString(basePath)) return path;
|
||||
|
||||
return addTrailingSlash(basePath) + path;
|
||||
};
|
||||
|
||||
const isMatchingLocation = (path: string, basePath?: AppBasePath) => {
|
||||
const match = matchPath(
|
||||
getConstructedPath(path, basePath),
|
||||
location.pathname,
|
||||
);
|
||||
return isDefined(match);
|
||||
};
|
||||
const isMatchingLocation = useCallback(
|
||||
(path: string, basePath?: AppBasePath) => {
|
||||
const match = matchPath(
|
||||
getConstructedPath(path, basePath),
|
||||
location.pathname,
|
||||
);
|
||||
return isDefined(match);
|
||||
},
|
||||
[location.pathname],
|
||||
);
|
||||
|
||||
return {
|
||||
isMatchingLocation,
|
||||
|
||||
+3
-1
@@ -6,6 +6,7 @@ import {
|
||||
PageDecorator,
|
||||
PageDecoratorArgs,
|
||||
} from '~/testing/decorators/PageDecorator';
|
||||
import { PrefetchLoadingDecorator } from '~/testing/decorators/PrefetchLoadingDecorator';
|
||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||
|
||||
const meta: Meta<PageDecoratorArgs> = {
|
||||
@@ -19,6 +20,7 @@ const meta: Meta<PageDecoratorArgs> = {
|
||||
},
|
||||
parameters: {
|
||||
msw: graphqlMocks,
|
||||
prefetchLoadingSetDelay: 1000,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -29,7 +31,7 @@ export type Story = StoryObj<typeof RecordIndexPage>;
|
||||
export const Default: Story = {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
decorators: [PageDecorator],
|
||||
decorators: [PrefetchLoadingDecorator, PageDecorator],
|
||||
play: async ({ canvasElement }) => {
|
||||
const canvas = within(canvasElement);
|
||||
|
||||
|
||||
@@ -94,8 +94,8 @@ msgid "{contextStoreNumberOfSelectedRecords} selected"
|
||||
msgstr "{contextStoreNumberOfSelectedRecords} geselekteer"
|
||||
|
||||
#. js-lingui-id: 6j5rE1
|
||||
#: src/modules/action-menu/actions/record-agnostic-actions/run-workflow-actions/hooks/useRunWorkflowActions.tsx
|
||||
#: src/modules/action-menu/actions/record-actions/workflow-run-record-actions/hooks/useWorkflowRunRecordActions.tsx
|
||||
#: src/modules/action-menu/actions/record-agnostic-actions/run-workflow-actions/hooks/useRunWorkflowRecordAgnosticActions.tsx
|
||||
#: src/modules/action-menu/actions/record-actions/run-workflow-actions/hooks/useRunWorkflowRecordActions.tsx
|
||||
msgid "{name}"
|
||||
msgstr "{name}"
|
||||
|
||||
@@ -167,15 +167,20 @@ msgid "A shared environment where you will be able to manage your customer relat
|
||||
msgstr "'n Gedeelde omgewing waar jy jou kliënteverhoudinge saam met jou span sal kan bestuur."
|
||||
|
||||
#. js-lingui-id: JE9zuL
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Ability to edit all settings"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 09tRFp
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "Ability to interact with each object"
|
||||
msgstr "Vermoeë om met elke objek te interaksie"
|
||||
|
||||
#. js-lingui-id: nJHSWx
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
msgid "Ability to interact with this specific object"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: ssjjFt
|
||||
#: src/modules/ui/input/components/ImageInput.tsx
|
||||
msgid "Abort"
|
||||
@@ -223,7 +228,8 @@ msgid "Action"
|
||||
msgstr "Aksie"
|
||||
|
||||
#. js-lingui-id: 7L01XJ
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelHeader.tsx
|
||||
msgid "Actions"
|
||||
msgstr "Aksies"
|
||||
|
||||
@@ -294,7 +300,7 @@ msgid "Add option"
|
||||
msgstr "Voeg opsie by"
|
||||
|
||||
#. js-lingui-id: M067Bn
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Add or remove users"
|
||||
msgstr ""
|
||||
|
||||
@@ -357,15 +363,14 @@ msgstr "Stel die rolverwante instellings aan"
|
||||
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
|
||||
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
|
||||
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
|
||||
msgid "Admin Panel"
|
||||
msgstr "Admin Paneel"
|
||||
|
||||
#. js-lingui-id: ae6Tab
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
msgid "Admin settings and system tools"
|
||||
msgstr ""
|
||||
#~ msgid "Admin settings and system tools"
|
||||
#~ msgstr ""
|
||||
|
||||
#. js-lingui-id: sxkWRg
|
||||
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerDatabaseEventForm.tsx
|
||||
@@ -408,7 +413,7 @@ msgid "All emails and events linked to this account will be deleted"
|
||||
msgstr "Alle e-posse en gebeurtenisse wat aan hierdie rekening gekoppel is, sal verwyder word"
|
||||
|
||||
#. js-lingui-id: 623MHa
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/constants/TextDataModelSelectOptions.ts
|
||||
msgid "All lines"
|
||||
msgstr "Alle lyne"
|
||||
|
||||
@@ -506,7 +511,7 @@ msgid "API keys"
|
||||
msgstr "API-sleutels"
|
||||
|
||||
#. js-lingui-id: vByqA1
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "API Keys & Webhooks"
|
||||
msgstr ""
|
||||
|
||||
@@ -698,6 +703,11 @@ msgstr "Outomaties skep van Persoonlike rekords by ontvang of stuur van e-posse"
|
||||
msgid "Average"
|
||||
msgstr "Gemiddelde"
|
||||
|
||||
#. js-lingui-id: iH8pgl
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectForm.tsx
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: Dht9W3
|
||||
#: src/pages/not-found/NotFound.tsx
|
||||
msgid "Back to content"
|
||||
@@ -850,6 +860,11 @@ msgstr "Kies die verstek geldeenheid wat van toepassing sal wees"
|
||||
msgid "Choose the fields that will identify your records"
|
||||
msgstr "Kies die velde wat jou rekords sal identifiseer"
|
||||
|
||||
#. js-lingui-id: hIJigY
|
||||
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatSelectDescription.tsx
|
||||
msgid "Choose the format used to display date value"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: KT6rEB
|
||||
#: src/modules/settings/accounts/components/SettingsNewAccountSection.tsx
|
||||
msgid "Choose your provider"
|
||||
@@ -1062,7 +1077,7 @@ msgid "Copy this key as it will not be visible again"
|
||||
msgstr "Kopieer hierdie sleutel aangesien dit nie weer sigbaar sal wees nie"
|
||||
|
||||
#. js-lingui-id: SGsgDO
|
||||
#: src/modules/settings/playground/components/PlaygroundSetupForm.tsx
|
||||
#: src/modules/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions.ts
|
||||
msgid "Core"
|
||||
msgstr "Kern"
|
||||
|
||||
@@ -1205,6 +1220,11 @@ msgstr "Huidige weergawe"
|
||||
#~ msgid "Current version:"
|
||||
#~ msgstr "Current version:"
|
||||
|
||||
#. js-lingui-id: 8Tg/JR
|
||||
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatLabel.ts
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: XQ681Q
|
||||
#: src/pages/settings/workspace/SettingsCustomDomain.tsx
|
||||
msgid "Custom Domain"
|
||||
@@ -1278,7 +1298,7 @@ msgid "Data model"
|
||||
msgstr "Databasis model"
|
||||
|
||||
#. js-lingui-id: 4BuYDo
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Data Model"
|
||||
msgstr ""
|
||||
|
||||
@@ -1336,10 +1356,15 @@ msgid "Deactivate Workflow"
|
||||
msgstr "Deaktiveer Werksvloei"
|
||||
|
||||
#. js-lingui-id: yAT3be
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/constants/TextDataModelSelectOptions.ts
|
||||
msgid "Deactivated"
|
||||
msgstr "Gedeaktiveer"
|
||||
|
||||
#. js-lingui-id: ovBPCi
|
||||
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatLabel.ts
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: mC21D6
|
||||
#: src/modules/settings/data-model/fields/forms/address/components/SettingsDataModelFieldAddressForm.tsx
|
||||
msgid "Default Country"
|
||||
@@ -1362,7 +1387,7 @@ msgid "Define the name and description of your object"
|
||||
msgstr "Definieer die naam en beskrywing van jou voorwerp"
|
||||
|
||||
#. js-lingui-id: Ntu10D
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Define user roles and access levels"
|
||||
msgstr ""
|
||||
|
||||
@@ -1416,8 +1441,13 @@ msgstr "Verwyder API-sleutel"
|
||||
msgid "Delete records"
|
||||
msgstr "Verwyder rekords"
|
||||
|
||||
#. js-lingui-id: 0ptEoK
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
msgid "Delete Records on {objectLabel}"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: mcXHCJ
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "Delete Records on All Objects"
|
||||
msgstr ""
|
||||
|
||||
@@ -1499,7 +1529,7 @@ msgstr "Aflopend"
|
||||
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
|
||||
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
|
||||
#: src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldConfigure.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissionsSettingsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsTableHeader.tsx
|
||||
msgid "Description"
|
||||
msgstr "Beskrywing"
|
||||
|
||||
@@ -1509,8 +1539,13 @@ msgstr "Beskrywing"
|
||||
msgid "Destroy"
|
||||
msgstr "Vernietig"
|
||||
|
||||
#. js-lingui-id: fq4Wxy
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
msgid "Destroy Records on {objectLabel}"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: L68qSB
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "Destroy Records on All Objects"
|
||||
msgstr ""
|
||||
|
||||
@@ -1537,8 +1572,13 @@ msgstr "Vertoon as 'n eenvoudige nommer of 'n persentasie"
|
||||
|
||||
#. js-lingui-id: i66xz9
|
||||
#: src/modules/settings/data-model/fields/forms/date/components/SettingsDataModelFieldDateForm.tsx
|
||||
msgid "Display as relative date"
|
||||
msgstr "Vertoon as relatiewe datum"
|
||||
#~ msgid "Display as relative date"
|
||||
#~ msgstr "Vertoon as relatiewe datum"
|
||||
|
||||
#. js-lingui-id: e/xgrw
|
||||
#: src/modules/settings/data-model/fields/forms/date/components/SettingsDataModelFieldDateForm.tsx
|
||||
msgid "Display Format"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: GoHpxA
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
@@ -1547,6 +1587,7 @@ msgstr "Vertoon teks op meerdere reëls"
|
||||
|
||||
#. js-lingui-id: ji7sqw
|
||||
#: src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx
|
||||
#: src/modules/spreadsheet-import/components/MatchColumnSelectFieldSelectDropdownContent.tsx
|
||||
msgid "Do not import"
|
||||
msgstr ""
|
||||
|
||||
@@ -1631,7 +1672,7 @@ msgid "Edit billing interval"
|
||||
msgstr "Redigeer faktureringsinterval"
|
||||
|
||||
#. js-lingui-id: 6vZ75d
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Edit CRM data structure and fields"
|
||||
msgstr ""
|
||||
|
||||
@@ -1650,8 +1691,13 @@ msgstr "Wysig velde"
|
||||
msgid "Edit payment method, see your invoices and more"
|
||||
msgstr "Redigeer betalingsmetode, sien jou fakture en meer"
|
||||
|
||||
#. js-lingui-id: MGkYcE
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
msgid "Edit Records on {objectLabel}"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 6n2zpV
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "Edit Records on All Objects"
|
||||
msgstr ""
|
||||
|
||||
@@ -1778,6 +1824,11 @@ msgstr "Engels"
|
||||
msgid "Enjoy a {withCreditCardTrialPeriodDuration}-days free trial"
|
||||
msgstr "Geniet 'n {withCreditCardTrialPeriodDuration}-dae gratis proeftydperk"
|
||||
|
||||
#. js-lingui-id: 9/30HU
|
||||
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatSelectDescription.tsx
|
||||
msgid "Enter in <0>Unicode</0> format"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: XJU8BD
|
||||
#: src/modules/settings/security/components/SSO/SettingsSSOOIDCForm.tsx
|
||||
msgid "Enter the credentials to set the connection"
|
||||
@@ -2046,7 +2097,7 @@ msgstr ""
|
||||
#~ msgstr "API-sleutel kon nie bevestig word nie. Kontroleer asseblief jou API-sleutel en probeer weer."
|
||||
|
||||
#. js-lingui-id: ocUvR+
|
||||
#: src/modules/settings/data-model/fields/forms/boolean/components/SettingsDataModelFieldBooleanForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/boolean/constants/BooleanDataModelSelectOptions.ts
|
||||
#: src/modules/object-record/record-board/record-board-column/utils/getAggregateOperationShortLabel.ts
|
||||
msgid "False"
|
||||
msgstr "Vals"
|
||||
@@ -2114,17 +2165,17 @@ msgid "Finnish"
|
||||
msgstr "Fins"
|
||||
|
||||
#. js-lingui-id: ZyIk6Y
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/constants/TextDataModelSelectOptions.ts
|
||||
msgid "First 10 lines"
|
||||
msgstr "Eerste 10 reëls"
|
||||
|
||||
#. js-lingui-id: I3hko2
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/constants/TextDataModelSelectOptions.ts
|
||||
msgid "First 2 lines"
|
||||
msgstr "Eerste 2 reëls"
|
||||
|
||||
#. js-lingui-id: BDDkm3
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/SettingsDataModelFieldTextForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/components/text/constants/TextDataModelSelectOptions.ts
|
||||
msgid "First 5 lines"
|
||||
msgstr "Eerste 5 reëls"
|
||||
|
||||
@@ -2139,6 +2190,11 @@ msgstr "Voornaam"
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Het jy jou wagwoord vergeet?"
|
||||
|
||||
#. js-lingui-id: abDZwc
|
||||
#: src/modules/settings/data-model/fields/forms/date/components/SettingsDataModelFieldDateForm.tsx
|
||||
msgid "Format e.g. d-MMM-y (qqq''yy)"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: wjsFMQ
|
||||
#: src/modules/billing/components/SettingsBillingMonthlyCreditsSection.tsx
|
||||
msgid "Free Credits Used"
|
||||
@@ -2215,6 +2271,7 @@ msgid "Go to Opportunities"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: MrE/Qb
|
||||
#: src/modules/action-menu/mock/action-menu-actions.mock.tsx
|
||||
#: src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx
|
||||
msgid "Go to People"
|
||||
msgstr ""
|
||||
@@ -2614,7 +2671,7 @@ msgid "Japanese"
|
||||
msgstr "Japanees"
|
||||
|
||||
#. js-lingui-id: OGXtL8
|
||||
#: src/modules/views/view-picker/components/ViewPickerContentCreateMode.tsx
|
||||
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
|
||||
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
|
||||
msgid "Kanban"
|
||||
msgstr "Kanban"
|
||||
@@ -2637,7 +2694,7 @@ msgid "Language"
|
||||
msgstr "Taal"
|
||||
|
||||
#. js-lingui-id: DU27lO
|
||||
#: src/modules/settings/admin-panel/health-status/components/WorkerQueueMetricsSection.tsx
|
||||
#: src/modules/settings/admin-panel/health-status/constants/WorkerQueueMetricsSelectOptions.ts
|
||||
msgid "Last 1 hour"
|
||||
msgstr "Laaste 1 uur"
|
||||
|
||||
@@ -2647,7 +2704,7 @@ msgid "Last 1 Hour (oldest → newest)"
|
||||
msgstr "Laaste 1 Uur (oudste → nuutste)"
|
||||
|
||||
#. js-lingui-id: XUlP/Y
|
||||
#: src/modules/settings/admin-panel/health-status/components/WorkerQueueMetricsSection.tsx
|
||||
#: src/modules/settings/admin-panel/health-status/constants/WorkerQueueMetricsSelectOptions.ts
|
||||
msgid "Last 12 hours"
|
||||
msgstr "Laaste 12 uur"
|
||||
|
||||
@@ -2662,7 +2719,7 @@ msgid "Last 24 Hours (oldest → newest)"
|
||||
msgstr "Laaste 24 Ure (oudste → nuutste)"
|
||||
|
||||
#. js-lingui-id: gdAJ4I
|
||||
#: src/modules/settings/admin-panel/health-status/components/WorkerQueueMetricsSection.tsx
|
||||
#: src/modules/settings/admin-panel/health-status/constants/WorkerQueueMetricsSelectOptions.ts
|
||||
msgid "Last 4 hours"
|
||||
msgstr "Laaste 4 uur"
|
||||
|
||||
@@ -2766,7 +2823,7 @@ msgid "Look up users to impersonate them."
|
||||
msgstr "Soek gebruikers om hulle na te boots."
|
||||
|
||||
#. js-lingui-id: n0FHLv
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Manage API keys and webhooks"
|
||||
msgstr ""
|
||||
|
||||
@@ -2782,7 +2839,7 @@ msgid "Manage Members"
|
||||
msgstr "Bestuur Lede"
|
||||
|
||||
#. js-lingui-id: eGGH1l
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
msgid "Manage security policies"
|
||||
msgstr ""
|
||||
|
||||
@@ -2847,7 +2904,7 @@ msgstr "Boodskap Sinchronisasie"
|
||||
#~ msgstr "Message Sync Status"
|
||||
|
||||
#. js-lingui-id: 6GBt0m
|
||||
#: src/modules/settings/playground/components/PlaygroundSetupForm.tsx
|
||||
#: src/modules/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions.ts
|
||||
#: src/modules/settings/accounts/components/SettingsAccountsMessageVisibilityCard.tsx
|
||||
#: src/modules/settings/accounts/components/SettingsAccountsCalendarVisibilitySettingsCard.tsx
|
||||
#: src/modules/onboarding/components/onboardingSyncEmailsOptions.tsx
|
||||
@@ -2911,8 +2968,9 @@ msgstr "Skuif regs"
|
||||
#: src/modules/settings/workspace/components/NameField.tsx
|
||||
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
|
||||
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissionsSettingsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelHeader.tsx
|
||||
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
|
||||
#: src/modules/settings/roles/components/SettingsRolesTableHeader.tsx
|
||||
#: src/modules/settings/developers/components/SettingsApiKeysTable.tsx
|
||||
@@ -3146,6 +3204,11 @@ msgstr "Geen meer lede om toe te wys nie"
|
||||
msgid "No output available"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: fE7upK
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelSection.tsx
|
||||
msgid "No overrides found"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 5pSj4j
|
||||
#: src/modules/billing/hooks/useEndSubscriptionTrialPeriod.ts
|
||||
msgid "No payment method found. Please update your billing details."
|
||||
@@ -3163,8 +3226,8 @@ msgstr "Geen rekords gevind nie"
|
||||
|
||||
#. js-lingui-id: Ev2r9A
|
||||
#: src/modules/spreadsheet-import/components/MatchColumnSelect.tsx
|
||||
msgid "No results"
|
||||
msgstr ""
|
||||
#~ msgid "No results"
|
||||
#~ msgstr ""
|
||||
|
||||
#. js-lingui-id: MA3x23
|
||||
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentWorkspaceMemberPickerDropdownContent.tsx
|
||||
@@ -3241,7 +3304,7 @@ msgid "Notes"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: HptUxX
|
||||
#: src/modules/settings/data-model/fields/forms/number/components/SettingsDataModelFieldNumberForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/number/constants/NumberDataModelSelectOptions.ts
|
||||
msgid "Number"
|
||||
msgstr "Nommer"
|
||||
|
||||
@@ -3256,6 +3319,7 @@ msgid "Number type"
|
||||
msgstr "Nommer tipe"
|
||||
|
||||
#. js-lingui-id: W0i24j
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelTableHeader.tsx
|
||||
#: src/modules/command-menu/components/CommandMenu.tsx
|
||||
msgid "Object"
|
||||
msgstr "Objek"
|
||||
@@ -3265,6 +3329,12 @@ msgstr "Objek"
|
||||
msgid "Object destination"
|
||||
msgstr "Object bestemming"
|
||||
|
||||
#. js-lingui-id: ZXhr6E
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelSection.tsx
|
||||
msgid "Object-Level Permissions"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: B3toQF
|
||||
#: src/pages/settings/data-model/SettingsObjects.tsx
|
||||
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
|
||||
@@ -3272,7 +3342,7 @@ msgstr "Object bestemming"
|
||||
#: src/pages/settings/data-model/SettingsNewObject.tsx
|
||||
#: src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx
|
||||
#: src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldConfigure.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "Objects"
|
||||
msgstr "Objekte"
|
||||
|
||||
@@ -3357,6 +3427,11 @@ msgstr "Ander Veranderlikes"
|
||||
msgid "Other workspaces"
|
||||
msgstr "Ander werksruimtes"
|
||||
|
||||
#. js-lingui-id: bv8ZsZ
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsTableRow.tsx
|
||||
msgid "Overridden on {isOverriddenBy} {pluralizedObject}"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: boJlGf
|
||||
#: src/pages/not-found/NotFound.tsx
|
||||
msgid "Page Not Found"
|
||||
@@ -3378,6 +3453,7 @@ msgid "Password reset link has been sent to the email"
|
||||
msgstr "Wagwoord herstel skakel is na die e-pos gestuur"
|
||||
|
||||
#. js-lingui-id: 1wdjme
|
||||
#: src/modules/action-menu/mock/action-menu-actions.mock.tsx
|
||||
#: src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx
|
||||
msgid "People"
|
||||
msgstr ""
|
||||
@@ -3410,7 +3486,7 @@ msgid "Percent not empty"
|
||||
msgstr "Persentasie nie leeg nie"
|
||||
|
||||
#. js-lingui-id: /roQKz
|
||||
#: src/modules/settings/data-model/fields/forms/number/components/SettingsDataModelFieldNumberForm.tsx
|
||||
#: src/modules/settings/data-model/fields/forms/number/constants/NumberDataModelSelectOptions.ts
|
||||
msgid "Percentage"
|
||||
msgstr "Persentasie"
|
||||
|
||||
@@ -3434,6 +3510,11 @@ msgstr ""
|
||||
msgid "Permanently destroy workflows"
|
||||
msgstr "Vernietig werkstroomme permanent"
|
||||
|
||||
#. js-lingui-id: UjCOlM
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelTableHeader.tsx
|
||||
msgid "Permission overrides"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 9cDpsw
|
||||
#: src/modules/settings/roles/role/components/SettingsRole.tsx
|
||||
msgid "Permissions"
|
||||
@@ -3630,6 +3711,11 @@ msgstr "Regenereer Sleutel"
|
||||
msgid "Relation type"
|
||||
msgstr "Verhouding tipe"
|
||||
|
||||
#. js-lingui-id: HR+PwH
|
||||
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatLabel.ts
|
||||
msgid "Relative"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 5icoS1
|
||||
#: src/pages/settings/Releases.tsx
|
||||
#: src/pages/settings/Releases.tsx
|
||||
@@ -3726,8 +3812,13 @@ msgstr ""
|
||||
msgid "Role name"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: gF4nBH
|
||||
#: src/modules/settings/roles/role/components/SettingsRole.tsx
|
||||
msgid "Role name cannot be empty"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: 5dJK4M
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
#: src/modules/settings/roles/components/SettingsRolesContainer.tsx
|
||||
#: src/modules/settings/roles/components/SettingsRolesContainer.tsx
|
||||
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
|
||||
@@ -3768,6 +3859,7 @@ msgstr "Skema"
|
||||
#. js-lingui-id: A1taO8
|
||||
#: src/modules/ui/navigation/navigation-drawer/components/MultiWorkspaceDropdown/internal/MultiWorkspaceDropdownWorkspacesListComponents.tsx
|
||||
#: src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelObjectPickerDropdownContent.tsx
|
||||
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentWorkspaceMemberPickerDropdown.tsx
|
||||
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
|
||||
#: src/modules/navigation/components/MainNavigationDrawerFixedItems.tsx
|
||||
@@ -3846,7 +3938,7 @@ msgstr "Geheim"
|
||||
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
|
||||
#: src/pages/settings/security/SettingsSecurity.tsx
|
||||
#: src/pages/settings/security/SettingsSecurity.tsx
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
|
||||
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
|
||||
msgid "Security"
|
||||
msgstr "Sekuriteit"
|
||||
@@ -3877,8 +3969,13 @@ msgstr "Sien verwyderde lopies"
|
||||
msgid "See deleted workflows"
|
||||
msgstr "Sien verwyderde werkvloeie"
|
||||
|
||||
#. js-lingui-id: FvBwjM
|
||||
#: src/modules/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevel.tsx
|
||||
msgid "See Records on {objectLabel}"
|
||||
msgstr ""
|
||||
|
||||
#. js-lingui-id: irbH/8
|
||||
#: src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx
|
||||
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection.tsx
|
||||
msgid "See Records on All Objects"
|
||||
msgstr ""
|
||||
|
||||
@@ -4018,6 +4115,11 @@ msgstr "Diensverskaffer Besonderhede"
|
||||
msgid "Set a default role for this workspace"
|
||||
msgstr "Stel | ||||