Compare commits

..
Author SHA1 Message Date
fc90b4ba8b i18n - docs translations (#21064)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-29 19:30:26 +02:00
88b77cb699 feat(server): opt-in FRONT_AUTO_BASE_URL for hostname-relative API URL (#20504)
## Problem

`generateFrontConfig()` writes `window._env_.REACT_APP_SERVER_BASE_URL =
process.env.SERVER_URL` unconditionally. The frontend then pins to that
absolute URL. For self-hosted deployments reachable from multiple
hostnames (Tailscale IP, LAN IP, internal DNS, SSH tunnel to localhost,
public DNS), only the one matching `SERVER_URL` works — others hit CORS
errors or unreachable hosts because the frontend tries to call the API
at the configured URL, not the one the user came in via.

The frontend already supports the right fallback:
`packages/twenty-front/src/config/index.ts:20-21` reads
`window._env_?.REACT_APP_SERVER_BASE_URL` and falls back to
`getDefaultUrl()` (which uses `window.location`) when the env var is
absent. But the server-side `generateFrontConfig` always populates
`_env_`, so the fallback never runs.

## Fix

One file: `packages/twenty-server/src/utils/generate-front-config.ts`.
Add a `FRONT_AUTO_BASE_URL=true` opt-in (also triggered when
`SERVER_URL` is unset entirely). When the toggle is on, inject
`window._env_ = {}` so the frontend's existing `getDefaultUrl()`
fallback resolves the origin from `window.location` at runtime.

## Backwards compatibility

When `SERVER_URL` is set AND `FRONT_AUTO_BASE_URL` is unset (or anything
other than `'true'`): unchanged — `REACT_APP_SERVER_BASE_URL:
process.env.SERVER_URL` is injected exactly as before.

The toggle is strictly additive. Existing single-hostname deployments
are not affected.

## Use case

Self-hosted Twenty reachable via:
- `http://100.115.12.29` over Tailscale
- `http://localhost:4440` over SSH tunnel
- `http://twenty.internal` over LAN DNS
- `http://crm.example.com` public

With `FRONT_AUTO_BASE_URL=true`, all four paths work without rebuilds or
per-hostname server processes.

## Test plan

- [ ] `SERVER_URL=http://x.com` (toggle unset) → `<script>window._env_ =
{"REACT_APP_SERVER_BASE_URL":"http://x.com"};</script>` (unchanged from
main)
- [ ] `SERVER_URL` unset → `<script>window._env_ = {};</script>` (new
fallback path)
- [ ] `SERVER_URL=http://x.com FRONT_AUTO_BASE_URL=true` →
`<script>window._env_ = {};</script>` (toggle wins)
- [ ] `FRONT_AUTO_BASE_URL=false SERVER_URL=http://x.com` → unchanged
(only `'true'` triggers the toggle)

---------

Co-authored-by: martmull <[email protected]>
2026-05-29 16:26:43 +00:00
Raphaël BosiandGitHub 0ed2e9d82d Docs: clarify numberOfSelectedRecords usage for RECORD_SELECTION items (#21059)
Add a note to the command menu items docs explaining that
RECORD_SELECTION already guarantees a non-empty selection, so
numberOfSelectedRecords > 0 is redundant in
conditionalAvailabilityExpression.
2026-05-29 17:59:14 +02:00
643cfe9b13 i18n - docs translations (#21062)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-29 17:29:40 +02:00
Thomas TrompetteandGitHub bc1b7f6fdf fix: resolve workflow form step auto-open race condition (#21053)
## Summary
- Fix intermittent failure where the Quick Lead workflow form step did
not auto-open
- Root cause: race conditions between SSE events, Apollo cache writes,
and the `runWorkflowVersion` mutation timing
- Add generic monotonicity guard in the SSE handler that drops stale
updates for all records (not just WorkflowRun)

## Changes
- **`useTriggerOptimisticEffectFromSseUpdateEvents.ts`**: Compare
incoming `updatedAt` with cached record before writing — skip if stale.
Moved `upsertRecordsInStore` after the guard so neither Apollo cache nor
Jotai store receive stale data.
- **`useRunWorkflowVersion.tsx`**: Await mutation before opening side
panel; register SSE listener eagerly before mutation
- **`useWorkflowRun.ts`**: Simplified back to plain `useFindOneRecord` +
schema parse (no extra state needed)
- **`generateWorkflowRunDiagram.ts`**: `shouldOpenStep` matches both
PENDING and RUNNING for form steps (backend RUNNING means "waiting for
user input")
- **`WorkflowRunVisualizerEffect.tsx`**: Pass `runStatus` directly
without status mapping
- **`WorkflowRunStepNodeDetail.tsx`**: Form is interactive when step is
PENDING or RUNNING
- **Deleted `latestWorkflowRunFamilyState.ts`**: No longer needed — the
generic SSE guard replaces it

## Test plan
- [x] Hard refresh, run Quick Lead workflow 10+ times — form should
always auto-open
- [x] Complete the form and verify all subsequent steps execute without
getting stuck
- [x] Verify the workflow diagram is always visible (never disappears)
- [x] Verify other record types still update correctly via SSE (e.g.
edit a person in another tab)
2026-05-29 14:18:24 +00:00
Raphaël BosiandGitHub 57118a868f Docs update: Calling a logic function from a front component (#21057)
Documents how a headless front component calls a server-side logic
function over HTTP via the /s/ route, so AI agents have a clear
reference for implementing this pattern.
2026-05-29 14:04:19 +00:00
93f848fd2f i18n - translations (#21055)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-29 15:30:31 +02:00
Félix MalfaitandGitHub 667cb95730 fix(sso): accept HTTP-POST binding and surface descriptive parser errors (#21051)
Fixes https://github.com/twentyhq/twenty/issues/21044

## Summary
- Closes [#490](https://github.com/twentyhq/private-issues/issues/490) —
JumpCloud customers (and anyone else whose IdP only advertises
`HTTP-POST` for `SingleSignOnService`) could not upload their SAML
metadata; the parser silently rejected them with a generic `Invalid
file` toast.
- The SAML IdP metadata parser now falls back to `HTTP-POST` when
`HTTP-Redirect` is not advertised. Both are valid SAML 2.0 bindings.
- The parser now returns a descriptive `reason` string (Zod issues +
custom errors) instead of an opaque `error: unknown`, and the upload
snack bar surfaces it so the customer can self-diagnose (e.g. `entityID:
entityID is not a valid URL` if they forgot to fill in their IdP Entity
ID).
- Added unit tests for HTTP-POST-only metadata, HTTP-Redirect
preference, and each descriptive-error path.

## Test plan
- [x] `npx jest parseSAMLMetadataFromXMLFile
--config=packages/twenty-front/jest.config.mjs` — 8/8 pass
- [x] `npx oxlint -c packages/twenty-front/.oxlintrc.json` on changed
files — clean
- [x] `npx oxfmt --check` on changed files — clean
- [ ] Manual: upload the customer's JumpCloud metadata (HTTP-POST only,
placeholder `entityID`) and confirm the error now says `Invalid file:
entityID: entityID is not a valid URL` instead of `Invalid file`
- [ ] Manual: upload metadata with a real `entityID` and HTTP-POST-only
binding, confirm the form populates correctly
2026-05-29 15:22:50 +02:00
martmullandGitHub 4e5d47168c 2439 improve command menu item display in right panel (#21020)
## Before

<img width="1512" height="389" alt="image"
src="https://github.com/user-attachments/assets/33274356-fb99-4a02-baa7-c324e6d151c6"
/>


## After

<img width="1512" height="357" alt="image"
src="https://github.com/user-attachments/assets/c0affb71-e920-4d64-b2f0-1bed53209ea5"
/>
2026-05-29 11:37:27 +00:00
neo773andGitHub 10c0bed462 fix: harden email-group SES provisioning, cleanup, and inbound replay (#21046)
## Changes

**Provisioning idempotent** (`aws-ses-register-domain.service.ts`)
- Each SES create call (`CreateConfigurationSet`, event destination,
contact list, tenant association) now swallow `AlreadyExistsException`
via `.send().catch()`.
- Retry after partial failure re-run every step, no blow up on "already
exists". Before: one existing resource kill whole provision.

**Workspace delete clean up cloud** (`workspace.service.ts`,
`emailing-domain-workspace-cleanup.job.ts`,
`emailing-domain.service.ts`)
- On workspace delete, fetch domain list first, pass domains to cleanup
job.
- Cleanup now loop `driver.cleanupDomain(domain)` per domain +
`deprovisionWorkspace`. Tear down SES identity/tenant/config-set, not
just delete DB rows.
- Before: DB rows gone, SES resources orphaned forever. Now: cloud match
DB.

**Inbound replay dedupe** (`ses-inbound-mail-handler.service.ts`)
- Use `snsMessageId` as job id. SNS deliver same message twice → second
is no-op. No duplicate inbound email import.
2026-05-29 10:31:03 +00:00
08b1c5738d i18n - translations (#21050)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-29 12:12:35 +02:00
martmullandGitHub c2df39405c Fix admin pannel server variable config tab (#21017)
## Before

<img width="1046" height="490" alt="image"
src="https://github.com/user-attachments/assets/450557de-fcf5-4b51-afdb-36c0c36e43d8"
/>


## After

<img width="1040" height="414" alt="image"
src="https://github.com/user-attachments/assets/4a5fe2ab-85d6-4431-9397-6f81ae24055d"
/>
2026-05-29 09:55:11 +00:00
3e2c50c6cf i18n - translations (#21048)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-29 11:21:23 +02:00
f67db8d8b2 i18n - translations (#21047)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-29 11:17:19 +02:00
3cd2458fdf i18n - website translations (#21045)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-29 11:12:31 +02:00
nitinandGitHub 13f09d8946 [Dashboards] Remove gauge chart types and code (#20410)
Follow-up cleanup to #20172.
2026-05-29 11:08:50 +02:00
martmullandGitHub 961745e9ba Fix latency spike on application lookup (#21042)
Fixes
https://discord.com/channels/1130383047699738754/1509645089062781058

Caching application entities to improve authentication latency
2026-05-29 11:06:36 +02:00
MarieandGitHub 41832c8d82 Fix workflow creation on view filtered by status (#21027)
Creating a workflow on a table with with a filter on status (eg: status
is "active") failed because it added the status to createOneWorkflow (in
order to have the record belonging to the view) - while
createOneWorkflow throwed a 400 exception when attempting to create a
workflow with a status (does not correpsond to a valid behaviour).

Silently stripping status rom create workflow endpoints.
2026-05-29 08:36:59 +00:00
3041ed3b6e chore: sync AI model catalog from models.dev (#21041)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <[email protected]>
2026-05-29 09:12:25 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Félix MalfaitWeikoclaude[bot] <41898282+claude[bot]@users.noreply.github.com>Félix Malfait
6d550611d2 chore(deps): bump typescript from 5.9.2 to 5.9.3 (#20991)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.2
to 5.9.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/TypeScript/releases">typescript's
releases</a>.</em></p>
<blockquote>
<h2>TypeScript 5.9.3</h2>
<p>Note: this tag was recreated to point at the correct commit. The npm
package contained the correct content.</p>
<p>For release notes, check out the <a
href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-9/">release
announcement</a></p>
<ul>
<li><a
href="https://github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93&amp;q=milestone%3A%22TypeScript+5.9.0%22+is%3Aclosed+">fixed
issues query for Typescript 5.9.0 (Beta)</a>.</li>
<li><a
href="https://github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93&amp;q=milestone%3A%22TypeScript+5.9.1%22+is%3Aclosed+">fixed
issues query for Typescript 5.9.1 (RC)</a>.</li>
<li><em>No specific changes for TypeScript 5.9.2 (Stable)</em></li>
<li><a
href="https://github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93&amp;q=milestone%3A%22TypeScript+5.9.3%22+is%3Aclosed+">fixed
issues query for Typescript 5.9.3 (Stable)</a>.</li>
</ul>
<p>Downloads are available on:</p>
<ul>
<li><a href="https://www.npmjs.com/package/typescript">npm</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/microsoft/TypeScript/commit/c63de15a992d37f0d6cec03ac7631872838602cb"><code>c63de15</code></a>
Bump version to 5.9.3 and LKG</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/8428ca4cc8a7ecc9ac18dd0258016228814f5eaf"><code>8428ca4</code></a>
🤖 Pick PR <a
href="https://redirect.github.com/microsoft/TypeScript/issues/62438">#62438</a>
(Fix incorrectly ignored dts file fr...) into release-5.9 (#...</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/a131cac6831aa6532ea963d0cb3131b957cad980"><code>a131cac</code></a>
🤖 Pick PR <a
href="https://redirect.github.com/microsoft/TypeScript/issues/62351">#62351</a>
(Add missing Float16Array constructo...) into release-5.9 (#...</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/04243333584a5bfaeb3434c0982c6280fe87b8d5"><code>0424333</code></a>
🤖 Pick PR <a
href="https://redirect.github.com/microsoft/TypeScript/issues/62423">#62423</a>
(Revert PR 61928) into release-5.9 (<a
href="https://redirect.github.com/microsoft/TypeScript/issues/62425">#62425</a>)</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/bdb641a4347af822916fb8cdb9894c9c2d2421dd"><code>bdb641a</code></a>
🤖 Pick PR <a
href="https://redirect.github.com/microsoft/TypeScript/issues/62311">#62311</a>
(Fix parenthesizer rules for manuall...) into release-5.9 (#...</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/0d9b9b92e2aca2f75c979a801abbc21bff473748"><code>0d9b9b9</code></a>
🤖 Pick PR <a
href="https://redirect.github.com/microsoft/TypeScript/issues/61978">#61978</a>
(Restructure CI to prepare for requi...) into release-5.9 (#...</li>
<li><a
href="https://github.com/microsoft/TypeScript/commit/2dce0c58af51cf9a9068365dc2f756c61b82b597"><code>2dce0c5</code></a>
Intentionally regress one buggy declaration output to an older version
(<a
href="https://redirect.github.com/microsoft/TypeScript/issues/62163">#62163</a>)</li>
<li>See full diff in <a
href="https://github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript&package-manager=npm_and_yarn&previous-version=5.9.2&new-version=5.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: Weiko <[email protected]>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Félix Malfait <[email protected]>
2026-05-29 08:39:35 +02:00
Félix MalfaitandGitHub 3c97d9648b fix(address): show saved address in record detail when street1 is null (#21033)
## Fixes #20084

### Problem
A saved address is visible in the **table view** but shows **"Empty"**
in the **record detail page** when `addressStreet1` is `null`.

This reproduces with the default seed data out of the box — e.g.
**Google** (city "Mountain View", no street), **Microsoft** (Redmond),
**Meta** (Menlo Park) — which is why several users reported hitting it
immediately.

### Root cause
The frontend zod schema required `addressStreet1` to be a **non-null**
string:

```ts
// isFieldAddressValue.ts
export const addressSchema = z.object({
  addressStreet1: z.string(),          // ← required non-null
  addressStreet2: z.string().nullable(),
  ...
});
```

…but the backend composite type marks it `isRequired: false`
(`address.composite-type.ts`), and the DB column is nullable. So the API
legitimately returns `addressStreet1: null` when only other subfields
are filled.

The two views diverge on how they render:

- **Record detail** gates the value behind `useIsFieldEmpty()` →
`isFieldValueEmpty()`, which for addresses calls
`isFieldAddressValue()`. With `addressStreet1: null` the `safeParse`
**fails**, so `isFieldValueEmpty` returns `true` and the `"Empty"`
placeholder is shown (`RecordInlineCellDisplayMode`).
- **Table view** (`RecordTableCellDisplayMode`) renders
`AddressFieldDisplay` directly with **no** empty check, so the address
stays visible.

This was a latent mismatch since the address guard was introduced.

### Fix
Make `addressStreet1` nullable to match the backend and the other
subfields:

- `addressSchema` → `addressStreet1: z.string().nullable()`
- `FieldAddressValue.addressStreet1` → `string | null`
- `FieldAddressDraftValue.addressStreet1` → `string | null` (keeps the
input/draft type consistent; the text input already renders `?? ''`)

The change is strictly more permissive — persisting and the settings
default-value form still accept string values; they now also accept
`null`.

### Tests
- `isFieldAddressValue.test.ts` — guard returns `true` for
`addressStreet1: null` with other subfields filled.
- `isFieldValueEmpty.test.ts` — new address coverage: empty address is
empty; **`street1: null` + city filled is NOT empty**; normal address is
not empty. (Added an `addressFieldDefinition` mock.)

Both new assertions were confirmed to **fail before the fix** and pass
after.

### Verification
- `npx jest isFieldValueEmpty isFieldAddressValue
normalize-address-field-value-for-persist` → 17 passed
- `npx nx typecheck twenty-front` → pass
- `npx nx lint:diff-with-main twenty-front` → 0 warnings, 0 errors
2026-05-29 08:38:47 +02:00
Félix MalfaitandGitHub 3afdabb93e fix(dashboards): isolate pie chart slice labels per widget (#21034)
## Summary

Fixes [#21014](https://github.com/twentyhq/twenty/issues/21014).

When two pie chart widgets shared the same group-by field (and therefore
the same slice ids) but used different aggregation operators (e.g.
`count` vs `sum`), the arc-link labels would mirror between the two
charts — both ending up showing either the count or the sum values,
depending on render order. Center metrics stayed correct.

**Root cause.** Nivo's `ArcLinkLabelsLayer` and `ArcsLayer` (from
`@nivo/arcs`) wire `react-spring`'s `useTransition` with `keys: e =>
e.id`. When two `<ResponsivePie>` instances render with overlapping ids,
the transitioned data bleeds across charts. The center metric is
unaffected because it's computed by a separate hook
(`usePieChartCenterMetricData`).

**Fix.** Namespace the Nivo-computed slice id per widget by passing an
`id` accessor to `<ResponsivePie>`:
```tsx
id={(datum) => `${id}:${String(datum.id)}`}
```
Lookups inside the widget switch to `datum.data.id` (the original,
un-namespaced id stored on the raw datum), so value/percentage
formatting, the custom tooltip, and the legend hover-dim behavior all
keep working.

Touched files:
- `GraphWidgetPieChart.tsx` — add `id` accessor
- `CustomArcsLayer.tsx` — compare legend highlight against
`datum.data.id`
- `getPieChartFormattedValue.ts`, `getPieChartTooltipData.ts` — match on
`datum.data.id`
- Tests for both utils get a regression case covering the namespaced
computed id

## Test plan

- [ ] `npx jest getPieChartFormattedValue` 
- [ ] `npx jest getPieChartTooltipData` 
- [ ] `npx tsc --noEmit` 
- [ ] Manual: dashboard with two pies on the same group-by field, one
`count` and one `sum`, "Display data label" on for both — confirm each
chart shows its own metric on the slices, and the central total is
unchanged.
- [ ] Manual: hover a legend item — the matching slice in that chart
stays solid while the others dim, and the sibling chart is not affected.
- [ ] Manual: clicking a slice still drills into the correctly filtered
view.
2026-05-29 05:51:10 +00:00
25b0e0d091 fix: correct typo occurence -> occurrence in metadata-event-emitter.ts (#21036)
## Summary

Fixes a spelling typo in
`packages/twenty-server/src/engine/subscriptions/metadata-event/metadata-event-emitter.ts`:

- Variable name `occurence` → `occurrence` (4 references on lines 101,
103, 114, 115)

## Changes

-
`packages/twenty-server/src/engine/subscriptions/metadata-event/metadata-event-emitter.ts`
— rename misspelled variable

Co-authored-by: james <[email protected]>
2026-05-29 05:48:57 +00:00
a43e5c3fb3 i18n - translations (#21032)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-28 22:15:29 +02:00
996cdaf3ff refactor(agents): split tool resolution into native and action rails (#20331)
## Summary

Splits AI agent tool resolution into two independent rails:

- **Native tools** — capabilities baked into the model SDK
(Anthropic/OpenAI `web_search`, xAI `web`/`x` provider options). Bound
by `NativeToolBinderService`, controlled by per-agent
`modelConfiguration` toggles. Opaque to Twenty — executed on the model
provider's servers.
- **Action tools** — registry-scoped tools from `ToolRegistryService`
(code interpreter, send email, record CRUD, etc.). Permission-gated via
the agent's role. Executed on Twenty's server.

Both rails merge into a single `ToolSet` at call time. When both
surfaces expose a search tool the model picks at runtime — coexistence
is intentional (relevant once Exa returns as an action, see below).

## Notable changes worth calling out

**Contract change: `AgentAsyncExecutorService.executeAgent` no longer
accepts `rolePermissionConfig`.** Workflow agents now scope exclusively
by the agent's own permission-tab role (`unionOf: [agentRoleId]`). The
previous role-merging path (caller role intersected with agent role) is
removed. No agent role → no registry tools (fail-closed by design).

**`NativeToolBinderService` relocated** from
`core-modules/tool-provider/native/` →
`metadata-modules/ai/ai-models/services/`. The binder needs SDK-package
knowledge, which lives in `ai-models`. Old location created a backwards
module dependency.

**`NATIVE_MODEL_TOOLS_BY_SDK_PACKAGE` is exhaustive over
`AiSdkPackage`** (`Record<>`, not `Partial<Record<>>`). Adding a new SDK
without thinking about native tools now fails the build. SDKs without
native tools (Bedrock, Google, Mistral, Azure, OpenAI-compatible) get
explicit `{}` entries.

**Discriminated union `kind: 'sdk-tool' | 'provider-option'`** lets one
registry describe both function tools (Anthropic/OpenAI) and runtime
sources (xAI). Follows the local `tool-provider` convention from #19321.

## Deferred to follow-ups

- **Exa web search is dropped from this PR** (along with its
`WEB_SEARCH_TOOL` permission flag and the Exa-specific gating). Exa
comes back as an **action/app tool** once apps can define permission
flags through the SDK — ongoing work in #20481.
- **xAI native search currently errors.** xAI deprecated its Live Search
API (the `web`/`x` provider-option sources this rail maps to), so xAI
returns `410` when native search is actually exercised. The code path
itself is clear — it's only hit if you test xAI native tools. Fixed
separately alongside the broader xAI model fixes.

## Conscious non-decisions

- **No "twenty-native" category.** `native` is reserved for
model/provider SDK features; everything Twenty-owned is just a
tool/action.
- **Coexistence over precedence.** No rule forcing an action search tool
to override native search (or vice-versa) — when both exist, it's the
user's choice in workflow agents and the model's choice in chat.

---------

Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
2026-05-28 22:08:05 +02:00
Raphaël BosiandGitHub 1d84695fb0 Fix: focus stack overwritten when auto-opening title cell on new record (#21029)
Fixes https://github.com/twentyhq/twenty/issues/20894

In `PageChangeEffect` `resetFocusStackToFocusItem` ran right after
`openNewRecordTitleCell`, wiping the title cell entry. Typing in the
auto-opened breadcrumb input (e.g. new workflow) triggered global
shortcuts and ignored Enter / Escape / Tab.

Reordered so the page reset runs first, then the title cell push lands
on top.

## Before


https://github.com/user-attachments/assets/d3c0c266-a493-46b8-b99b-32f4381b8664


## After


https://github.com/user-attachments/assets/3a886386-f438-46d2-a6ea-9ee6908d6df2
2026-05-28 19:23:40 +00:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Weiko
64e0b76d00 chore(deps): bump js-cookie from 3.0.5 to 3.0.7 (#20992)
Bumps [js-cookie](https://github.com/js-cookie/js-cookie) from 3.0.5 to
3.0.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/js-cookie/js-cookie/releases">js-cookie's
releases</a>.</em></p>
<blockquote>
<h2>v3.0.7</h2>
<ul>
<li>Prevent cookie attribute injection: CVE-2026-46625 (eb3c40e)</li>
<li>Add <code>Partitioned</code> attribute to readme (b994768)</li>
<li>Publish to npm registry via trusted publisher exclusively
(4dc71be)</li>
<li>Ensure consistent behaviour for <code>get('name')</code> +
<code>get()</code> (1953d30)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/17bacba0171dd022728d8fdeba3203c60791bf58"><code>17bacba</code></a>
Craft v3.0.7 release</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/adb823cb7e95ead47f3af4d4951e589acbde2077"><code>adb823c</code></a>
Fix release workflow halting at <code>git tag</code></li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/5f9e759b07d2752e8407a3a43fb5f879bf384c5e"><code>5f9e759</code></a>
May remove Git user config from release workflow</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/6ac921184c7b3b7d9431c88707f56521acd72ab4"><code>6ac9211</code></a>
Fix release workflow not able to push commit + tag</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/2278bc55e1804c4c2d9bd2110a9b449949a52751"><code>2278bc5</code></a>
Fix missing package version bump</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/eb3c40e89731e99b8970faaf35ddad249c6c0020"><code>eb3c40e</code></a>
Prevent cookie attribute injection</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/f6f157f430d707d2ffd0c9c9138227a6cea564e5"><code>f6f157f</code></a>
Bump globals from 17.5.0 to 17.6.0</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/f409d022da50a0c6fa8724f087fbc50fab9a9533"><code>f409d02</code></a>
Bump eslint from 10.2.0 to 10.3.0</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/a686883c03a754c04546cfc1653911a70a640b40"><code>a686883</code></a>
Bump protobufjs in the npm_and_yarn group across 1 directory</li>
<li><a
href="https://github.com/js-cookie/js-cookie/commit/c6112d2d4f2881a12aaf89d9e2996ef6870eb6d0"><code>c6112d2</code></a>
Bump <code>@​protobufjs/utf8</code> in the npm_and_yarn group across 1
directory</li>
<li>Additional commits viewable in <a
href="https://github.com/js-cookie/js-cookie/compare/v3.0.5...v3.0.7">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new
releaser for js-cookie since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=js-cookie&package-manager=npm_and_yarn&previous-version=3.0.5&new-version=3.0.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Weiko <[email protected]>
2026-05-28 21:25:35 +02:00
Félix MalfaitandGitHub 8a74ea8829 fix(contact-creation): enrich missing names on auto-created contacts (#21018)
## Summary

Three related fixes to the auto-creation of People records from calendar
events and email messages, all centred on the data-quality problem of
contacts being created with missing or malformed names.

### 1. Enrich names on existing contacts (commit 1)

Previously: when an email or calendar import matched an existing Person
by email, the existing record was left untouched — even if the new
source carried a better name.

This is the root cause of contacts like `"Félix"` (no last name)
sticking around forever: the `To:`/`Cc:` headers of outbound emails
rarely include a display name, and Google Calendar only returns
`displayName` for attendees already in the organizer's address book. So
the first sighting often creates a Person as `{firstName: "felix",
lastName: ""}`, and a later inbound `From: "Félix Malfait"
<[email protected]>` — which would have produced the right name — gets
silently dropped because the Person already exists.

The new `computePeopleToEnrichNames` bucket and
`CreatePersonService.enrichPeopleNames` method fill in missing
`firstName`/`lastName` fields from the new parsed name, with
conservative rules:
- Only enrich when the existing Person's `createdBy.source` is
`CALENDAR` or `EMAIL` — `MANUAL`, `IMPORT`, `API`, `WORKFLOW`, etc. are
never touched.
- Only fill empty fields. Non-empty `firstName`/`lastName` are never
overwritten.
- Soft-deleted contacts continue to be handled by the existing restore
path.

### 2. Handle multi-comma "Last, First, Suffix" display names (commit 2)

The comma-inverted swap in the parser previously required *exactly* one
comma. Names like `"Smith, Jane, Jr."`, `"O'Brien, Mary, MD"` or `"Doe,
John, Patrick"` fell through to the space-split fallback, which stored
the comma in `firstName` (e.g. `"Smith,"`) and produced garbled records
(the avatar shows a single "B" and the name reads `"Barbey, Julien"`
because the entire string lives in `firstName`).

The regex now splits on the first comma and treats the remainder as the
first name, collapsing any further commas to spaces. Single-comma
behaviour is unchanged.

### 3. Perf: skip the parser when an existing record is already
populated (commit 3)

`computePeopleToEnrichNames` runs on every cron-driven email/calendar
import batch. The first version called the display-name parser for every
matched existing person, even when both `firstName` and `lastName` were
already set — i.e. the steady-state case after the initial enrichment
pass.

Reordered so the cheap "both fields populated" check short-circuits
before any parsing happens. Same behaviour, fewer parser calls on the
hot path.

## Test plan

- [x] 8 new unit tests for the enrichment bucket: empty `lastName`
enrichment, both `EMAIL` and `CALENDAR` sources, non-overwrite of
non-empty fields, skip on `MANUAL`/`IMPORT`, skip when the new source
also has no last name, skip for soft-deleted, fill `firstName` while
preserving `lastName`, handle null `name` field
- [x] 5 new parser tests for multi-comma forms: `"Last, First, Suffix"`,
credential suffixes (`MD`), three-token forms, whitespace around inner
commas, `:GROUP` tag interaction
- [x] 1 new parser test on the single-comma path covering multi-word
first names (`"Smith, Mary Jane"`)
- [x] All 15 existing parser tests still pass
- [x] All 116 tests in `contact-creation-manager` pass
- [x] `npx nx typecheck twenty-server`
- [x] `npx oxlint --type-aware` + `npx oxfmt --check` on changed files
- [ ] Manual: trigger a fresh contact creation from an outbound email
with no display name, then a subsequent inbound email from the same
address with a full display name, and confirm the Person's last name
gets populated
2026-05-28 20:49:56 +02:00
Félix MalfaitandGitHub f4ead89956 refactor(twenty-orm): migrate 23 grandfathered entities to WorkspaceScopedRepository (#20987)
## Summary

Follow-up to #20953. Migrates 23 of the 30 entities that were left in
`WORKSPACE_SCOPED_EXEMPTIONS` last time, so the lint rule's
workspaceId-enforcement default now covers most of the core/metadata
schema.

### Migrated (23 entities, 88 files, 22 commits)

| Family | Entities |
|---|---|
| Trivial caches | `NavigationMenuItem`, `Skill`, `DataSource`,
`Webhook`, `CommandMenuItem`, `IndexMetadata` |
| Views | `View`, `ViewField`, `ViewFieldGroup`, `ViewFilter`,
`ViewFilterGroup`, `ViewGroup`, `ViewSort` |
| Layouts | `PageLayout`, `PageLayoutTab`, `PageLayoutWidget` |
| Roles & permissions | `Role`, `RoleTarget`, `PermissionFlag`,
`ObjectPermission`, `FieldPermission`, `RowLevelPermissionPredicate`,
`RowLevelPermissionPredicateGroup` |

For each entity: swap `@InjectRepository(X)` →
`@InjectWorkspaceScopedRepository(X)` (and the field type →
`WorkspaceScopedRepository<X>`); rewrite every call site to pass
`workspaceId` as the first arg (stripped from `where`/criteria — the
wrapper throws if you include it now); register
`provideWorkspaceScopedRepository(X)` in every owning NestJS module;
update affected spec providers to
`getWorkspaceScopedRepositoryToken(X)`.

### Rule update

- `ApplicationRegistrationVariableEntity` was misclassified — moved to
`STRUCTURAL_EXEMPTIONS` (no `workspaceId` column; it's keyed on
`applicationRegistrationId` at the instance level).
- 22 of the 23 migrated entities removed from
`WORKSPACE_SCOPED_EXEMPTIONS` entirely (zero remaining raw
`@InjectRepository` sites).
- `RoleTargetEntity` also removed; one call site in
`user-workspace.service.ts` keeps a raw injection with an
`eslint-disable` + reason because `softRemove(...)` is not on the
wrapper API yet (the migration would require threading `workspaceId`
through `deleteUserWorkspace`'s three callers).

### Still exempted (7 entities, follow-up PRs)

| Entity | Why deferred |
|---|---|
| `ApplicationEntity` | ~50 sites with several cross-workspace lookups
by id (auth, OAuth, file-storage, cleanup) |
| `CalendarChannelEntity` / `MessageChannelEntity` | Use
`.increment(...)` (not on wrapper) and
`repository.manager.transaction(...)` — wrapper needs to grow
`.increment` + the transaction sites need `withManager` or dual-inject |
| `FieldMetadataEntity` / `ObjectMetadataEntity` | The metadata services
`extends TypeOrmQueryService<X>` and `super(rawRepo)` — requires
dual-inject or reworking the inheritance |
| `KeyValuePairEntity` | Allows `workspaceId: IsNull()` for
instance-level config; wrapper rejects null |
| `UpgradeMigrationEntity` | Same — instance-level + cross-workspace
ledger |

## Test plan

- [x] `npx nx typecheck twenty-server` — clean
- [x] `npx nx lint twenty-server` — clean (0/0)
- [x] All 10 affected unit specs pass (115 tests) — api-key, agent-role,
permissions, workspace-roles-permissions-cache, view-filter-group,
workflow-version-step-operations, two-factor-authentication (service +
resolver), user-workspace, file
- [ ] Server integration tests in CI
2026-05-28 20:46:21 +02:00
Félix MalfaitandGitHub 865ca697ca Fix AI permission gating: use Ask AI for chat UI, AI Settings for admin endpoints (#21030)
## Summary

Closes #20662.

Two AI permission flags exist:
- **`AI`** (label "Ask AI") — user-facing: chat with AI agents, use AI
features
- **`AI_SETTINGS`** (label "AI") — admin: create and configure AI agents

After auditing every use of these flags I found:

### Frontend — chat UI gated by the admin permission (user-facing bug
from the issue)
A user granted only `Ask AI` could not see chat tabs, the "new chat"
button (desktop & mobile), or the chat content pane; thread
initialization was also skipped, leaving the chat in a half-initialized
state and producing intermittent `THREAD_NOT_FOUND` errors. Switched
these to `AI`:
- `MainNavigationDrawerTabsRow.tsx`
- `MainNavigationDrawer.tsx`
- `MobileNavigationBar.tsx`
- `AgentChatThreadInitializationEffect.tsx`

### Backend — admin-only resolvers gated by the user permission
(privilege escalation)
Two resolvers had a class-level guard of `AI`, letting any user with the
user-facing flag reach admin endpoints (skill CRUD, eval runs). Switched
the class-level guards to `AI_SETTINGS`:
- `SkillResolver` — create/update/delete/activate/deactivate skills
- `AgentTurnResolver` — read turns, run/grade evaluations

### Left as-is (already correct)
- `AgentResolver` — class-level `AI` for reads (workflow editors and
admin pages both need them), mutation-level `AI_SETTINGS` overrides for
writes
- `AgentChatResolver` & `AgentChatSubscriptionResolver` — already `AI`
- `AiGenerateTextController` — already `AI`
- Workspace AI config fields in `workspace.service.ts` — already
`AI_SETTINGS`

## Test plan

- [ ] As a user with `Ask AI` only (no `AI_SETTINGS`): chat tabs, "new
chat" button, and chat history pane are visible on desktop + mobile;
sending a message works; no `THREAD_NOT_FOUND` errors
- [ ] As a user with `AI_SETTINGS` but no `Ask AI`: chat UI is hidden
- [ ] As a user with `Ask AI` only: calling `skills` / `createSkill` /
`agentTurns` / `runEvaluationInput` via GraphQL returns permission
denied
- [ ] As an admin (`AI_SETTINGS`): skill settings and agent eval pages
still work
2026-05-28 20:21:58 +02:00
Paul RastoinandGitHub ebfaca5b3d EncryptedString PlaintextString branded string types (#21001)
## Summary

closes https://github.com/twentyhq/core-team-issues/issues/2464

Introduces compile-time branded types to distinguish encrypted
ciphertext from plaintext strings, preventing mix-ups like the one fixed
in #20819 — but at the type level rather in addition to the one existing
at runtime.

### Branded string primitives

- Created `EncryptedString` and `PlaintextString` as hard nominal brands
using `z.string().brand(...)`, making them non-assignable to each other
or to raw `string`
- Created `isEncryptedString` type predicate to narrow `string` to
`EncryptedString` based on the `enc:v2:` envelope prefix
- Retyped `SecretEncryptionService`: `encryptVersioned` accepts
`PlaintextString`, `decryptVersioned` returns `PlaintextString`

### Entity typing

- Typed encrypted columns across entities:
`SigningKeyEntity.privateKey`,
`TwoFactorAuthenticationMethodEntity.secret`,
`ApplicationRegistrationVariableEntity.encryptedValue`,
`ApplicationVariableEntity.value`
- Parameterized JSONB types for connected account connection parameters
(`ImapSmtpCaldavParams<Pwd>`) with reusable aliases
`EncryptedImapSmtpCaldavParams` / `DecryptedImapSmtpCaldavParams`
- Typed DTOs (`CreateApplicationRegistrationVariableInput`,
`UpdateApplicationRegistrationVariablePayload`,
`UpdateApplicationVariableEntityInput`) with `PlaintextString`

### ApplicationVariable always-encrypt uniformization

- Retyped `ApplicationVariableEntity.value` to `EncryptedString | ''` —
all values are now encrypted regardless of `isSecret`
- Updated `ApplicationVariableEntityService` to always encrypt on write
and always decrypt on read
- Simplified `UpdateApplicationVariableActionHandlerService` by removing
conditional encrypt/decrypt-on-isSecret-toggle logic
- Added slow instance command (`2.9.0`) to backfill-encrypt existing
`isSecret=false` plaintext rows and tighten the `CHECK` constraint

### ConfigStorageService refactor

- Split `convertAndSecureValue` (which used `any`) into two well-typed
methods: `convertAndDecrypt` and `convertAndEncrypt`
- Introduced `isSensitiveStringValue` type predicate to narrow values
before encryption/decryption

### What's next
- Typeorm entity derivation to strictly type sitemap configuration as
code + handler logic for encryption rotation
- https://github.com/twentyhq/core-team-issues/issues/2465
2026-05-28 17:41:16 +02:00
WeikoandGitHub 9b54200d8c Fix playwright CI (#21024)
## Context
The Install Playwright step ran npx playwright install with no
arguments, which downloads all browsers (Chromium + Firefox + WebKit +
ffmpeg, ~500MB+) on every run with no caching.

Fix:
- Install Chromium only — npx playwright install chromium instead of all
browsers.
- Cache the browser binaries — actions/cache on ~/.cache/ms-playwright,
keyed on the resolved Playwright version (v4-playwright-browsers-${{
runner.os }}-<version>). On a cache hit the install step is skipped
entirely; the cache invalidates automatically when the Playwright
version bumps.
2026-05-28 14:19:58 +00:00
bd6811d060 i18n - translations (#21022)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-28 15:59:42 +02:00
b32249877a i18n - translations (#21021)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-28 15:55:32 +02:00
martmullandGitHub 6fb6ef4e7a Add darkmode for oAuth screen (#21005)
## after

<img width="1512" height="828" alt="image"
src="https://github.com/user-attachments/assets/71664eab-c921-45da-ac67-7a660c976d5c"
/>
2026-05-28 15:48:57 +02:00
Raphaël BosiandGitHub bb4e28904f Support the "Me" filter for workspace members in dashboard widgets and add multi select (#20971)
Fixes https://github.com/twentyhq/twenty/issues/20225

The "Me" filter (current workspace member) worked in view filters but
not in dashboard widget filters — the server never resolved the
placeholder, and the widget side-panel UI had no "Me" option and only
allowed single selection.

Backend: `ChartDataQueryService` now forwards the current workspace
member id (from authContext) into filterValueDependencies, so the shared
filter logic resolves "Me" the same way it does for view filters. Added
unit tests for the converter.

Frontend: new multi-select picker for workspace member filters in the
widget side panel, mirroring the view filter's actor select: search
input, "Me" pinned item, and a multi-select workspace member list.

## Before
<img width="3024" height="1488" alt="CleanShot 2026-05-27 at 17 16
36@2x"
src="https://github.com/user-attachments/assets/b2cff46c-53e5-4e8a-a463-b106daf96c8c"
/>

## After
<img width="3024" height="1488" alt="CleanShot 2026-05-27 at 17 14
05@2x"
src="https://github.com/user-attachments/assets/8b3b5f11-44b9-4ae5-a2f3-9c7a689f4bb2"
/>
2026-05-28 15:43:47 +02:00
c3d1af89ae i18n - docs translations (#21019)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-28 15:43:18 +02:00
Raphaël BosiandGitHub e6221c5f0e Fix twenty sdk billing exports (#21016)
Fix two omissions from #19973 that prevented `twenty-sdk/billing` from
being a fully exported subpath:

- `package.json`: add `billing` to `typesVersions` (every other subpath
was listed; billing was the only one missing, breaking type resolution
for consumers using classic TS moduleResolution).
- `project.json`: add the billing vite build and `dist/billing` output
to the `build:sdk` target
2026-05-28 15:41:24 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6566a918af chore(deps): bump @apollo/client from 4.1.6 to 4.2.0 (#20993)
Bumps [@apollo/client](https://github.com/apollographql/apollo-client)
from 4.1.6 to 4.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/apollographql/apollo-client/releases">@​apollo/client's
releases</a>.</em></p>
<blockquote>
<h2><code>@​apollo/client</code><a
href="https://github.com/4"><code>@​4</code></a>.2.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/apollographql/apollo-client/pull/13132">#13132</a>
<a
href="https://github.com/apollographql/apollo-client/commit/f3ce805425d10a9666218a8e109288a2d46dcab1"><code>f3ce805</code></a>
Thanks <a
href="https://github.com/phryneas"><code>@​phryneas</code></a>! -
Introduce &quot;classic&quot; and &quot;modern&quot; method and hook
signatures.</p>
<p>Apollo Client 4.2 introduces two signature styles for methods and
hooks. All signatures previously present are now &quot;classic&quot;
signatures, and a new set of &quot;modern&quot; signatures are added
alongside them.</p>
<p><strong>Classic signatures</strong> are the default and are identical
to the signatures before Apollo Client 4.2, preserving backward
compatibility. Classic signatures still work with manually specified
TypeScript generics (e.g.,
<code>useSuspenseQuery&lt;MyData&gt;(...)</code>). However, manually
specifying generics has been discouraged for a long time—instead, we
recommend using <code>TypedDocumentNode</code> to automatically infer
types, which provides more accurate results without any manual
annotations.</p>
<p><strong>Modern signatures</strong> automatically incorporate your
declared <code>defaultOptions</code> into return types, providing more
accurate types. Modern signatures infer types from the document node and
do not support manually passing generic type arguments; TypeScript will
produce a type error if you attempt to do so.</p>
<p>Methods and hooks automatically switch to modern signatures the
moment any non-optional property is declared in
<code>DeclareDefaultOptions</code>. The switch happens across all
methods and hooks globally:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  namespace ApolloClient {
    namespace DeclareDefaultOptions {
      interface WatchQuery {
errorPolicy: &quot;all&quot;; // non-optional → modern signatures
activated automatically
      }
    }
  }
}
</code></pre>
<p>Users can also manually switch to modern signatures without declaring
any <code>defaultOptions</code>, for example when wanting accurate type
inference without relying on global <code>defaultOptions</code>:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  export interface TypeOverrides {
    signatureStyle: &quot;modern&quot;;
  }
}
</code></pre>
<p>Users can do a global <code>DeclareDefaultOptions</code> type
augmentation and then manually switch back to &quot;classic&quot; for
migration purposes:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  export interface TypeOverrides {
    signatureStyle: &quot;classic&quot;;
  }
}
</code></pre>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/apollographql/apollo-client/blob/main/CHANGELOG.md">@​apollo/client's
changelog</a>.</em></p>
<blockquote>
<h2>4.2.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/apollographql/apollo-client/pull/13132">#13132</a>
<a
href="https://github.com/apollographql/apollo-client/commit/f3ce805425d10a9666218a8e109288a2d46dcab1"><code>f3ce805</code></a>
Thanks <a
href="https://github.com/phryneas"><code>@​phryneas</code></a>! -
Introduce &quot;classic&quot; and &quot;modern&quot; method and hook
signatures.</p>
<p>Apollo Client 4.2 introduces two signature styles for methods and
hooks. All signatures previously present are now &quot;classic&quot;
signatures, and a new set of &quot;modern&quot; signatures are added
alongside them.</p>
<p><strong>Classic signatures</strong> are the default and are identical
to the signatures before Apollo Client 4.2, preserving backward
compatibility. Classic signatures still work with manually specified
TypeScript generics (e.g.,
<code>useSuspenseQuery&lt;MyData&gt;(...)</code>). However, manually
specifying generics has been discouraged for a long time—instead, we
recommend using <code>TypedDocumentNode</code> to automatically infer
types, which provides more accurate results without any manual
annotations.</p>
<p><strong>Modern signatures</strong> automatically incorporate your
declared <code>defaultOptions</code> into return types, providing more
accurate types. Modern signatures infer types from the document node and
do not support manually passing generic type arguments; TypeScript will
produce a type error if you attempt to do so.</p>
<p>Methods and hooks automatically switch to modern signatures the
moment any non-optional property is declared in
<code>DeclareDefaultOptions</code>. The switch happens across all
methods and hooks globally:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  namespace ApolloClient {
    namespace DeclareDefaultOptions {
      interface WatchQuery {
errorPolicy: &quot;all&quot;; // non-optional → modern signatures
activated automatically
      }
    }
  }
}
</code></pre>
<p>Users can also manually switch to modern signatures without declaring
any <code>defaultOptions</code>, for example when wanting accurate type
inference without relying on global <code>defaultOptions</code>:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  export interface TypeOverrides {
    signatureStyle: &quot;modern&quot;;
  }
}
</code></pre>
<p>Users can do a global <code>DeclareDefaultOptions</code> type
augmentation and then manually switch back to &quot;classic&quot; for
migration purposes:</p>
<pre lang="ts"><code>// apollo.d.ts
import &quot;@apollo/client&quot;;
declare module &quot;@apollo/client&quot; {
  export interface TypeOverrides {
    signatureStyle: &quot;classic&quot;;
  }
}
</code></pre>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/apollographql/apollo-client/commit/e010bdd239b5c10415d4b70ca791467cde12fc88"><code>e010bdd</code></a>
Version Packages (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13241">#13241</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/9c4c01a640b43bfb47bd52b25d5881c4ad7bec71"><code>9c4c01a</code></a>
Release 4.2 (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13129">#13129</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/222838e99bc6054120cc1f881bb225b1ef049de9"><code>222838e</code></a>
Exit prerelease mode</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/7d3a533c811a8423536ceeebccc06413ded5b6a3"><code>7d3a533</code></a>
Merge branch 'main' into release-4.2</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/f20d591bbf74cb4f0d87ec9a14b93a59fe46b039"><code>f20d591</code></a>
chore(deps): update actions/create-github-app-token digest to d72941d
(<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13239">#13239</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/d4a28b6142e47164c8a24bd8c05a8aa3f1ce4eee"><code>d4a28b6</code></a>
chore(deps): pin dependencies (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13237">#13237</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/c1f39cf5402b052ab92886a1857840a745aee02b"><code>c1f39cf</code></a>
ci: pin Actions@SHA and disable cache on workflows with elevated OIDC
permiss...</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/511048b7bd6253a38a6b7ebe58e9674a39c74273"><code>511048b</code></a>
Event-based refetching docs (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13228">#13228</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/d1f68f1a5fdb7c6915a72b2426cad373a0526c06"><code>d1f68f1</code></a>
Version Packages (rc) (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13234">#13234</a>)</li>
<li><a
href="https://github.com/apollographql/apollo-client/commit/f1b541fed4111028b6842727178288156582e669"><code>f1b541f</code></a>
Prepare for rc release (<a
href="https://redirect.github.com/apollographql/apollo-client/issues/13232">#13232</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/apollographql/apollo-client/compare/@apollo/[email protected]...@apollo/[email protected]">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@apollo/client&package-manager=npm_and_yarn&previous-version=4.1.6&new-version=4.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 15:12:52 +02:00
martmullandGitHub 6ea637d6c5 Export STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS (#21010)
fix https://discord.com/channels/1130383047699738754/1509086323464474705
2026-05-28 12:51:01 +00:00
Félix MalfaitandGitHub 531410f64a fix(ai): expose MORPH_RELATION join columns in AI/MCP tool schemas (#21012)
## Summary

- Fixes a bug where `noteTarget` (and any other morph-relation join
object) created via AI/MCP would land with `targetCompanyId` /
`targetPersonId` / `targetOpportunityId` left null, even though the tool
reported success.
- Root cause: the Zod schema generators for the AI tools only branched
on `FieldMetadataType.RELATION`. MORPH_RELATION fields fell through to
the default case — for `create_*` they were exposed as `targetCompany:
string` instead of `targetCompanyId: uuid`, and for `group_by_*` they
were silently skipped entirely. Downstream
(`data-arg-processor.service.ts` and the group-by arg processor) already
accept the join-column form for both kinds of relations via
`computeMorphOrRelationFieldJoinColumnName` and
`isMorphOrRelationFlatFieldMetadata`, so the fix is purely in the schema
generators.

## Changes

- `record-properties.zod-schema.ts` — extend the existing RELATION
MANY_TO_ONE / ONE_TO_MANY branches to also match MORPH_RELATION.
- `group-by-tool.zod-schema.ts` — replace the silent MORPH_RELATION skip
with the same treatment as RELATION MANY_TO_ONE (exposes `${name}Id` as
a groupBy option).
- `test/integration/ai/suites/mcp-tool-execution.integration-spec.ts` —
new file. First integration test for tool execution end-to-end. Drives
the real MCP JSON-RPC endpoint with the seeded API key (`learn_tools`
for schema introspection, `execute_tool` for invocation):
- asserts `create_note_target`'s schema exposes `targetCompanyId` /
`targetPersonId` / `targetOpportunityId` as UUIDs and does **not**
expose `targetCompany` / `targetPerson` / `targetOpportunity`.
- creates a company + note + noteTarget via MCP, then queries the
workspace schema to confirm `targetCompanyId` is actually persisted in
the FK column.
- asserts `group_by_note_targets` schema accepts `targetCompanyId` as a
groupBy key.
- sets up 3 noteTargets (2 → company A, 1 → company B), calls
`group_by_note_targets` by `targetCompanyId`, and asserts the counts.

Out of scope: `record-filter.zod-schema.ts` has the same pattern (only
RELATION) — left for a follow-up so this PR stays focused on what was
reported.

## Test plan

- [x] `npx nx typecheck twenty-server`
- [x] `npx oxlint --type-aware` on changed files — clean
- [x] `npx oxfmt --check` on changed files — clean
- [x] Integration tests pass (4/4) after `database:reset`:
- `should expose the morph-relation join columns as \`${name}Id\` UUID
parameters`
- `should persist targetCompanyId when create_note_target is invoked via
MCP`
  - `should expose targetCompanyId as a valid groupBy option`
  - `should group noteTargets by targetCompanyId via MCP`
2026-05-28 14:17:10 +02:00
182960051f i18n - translations (#21013)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-28 13:30:39 +02:00
Félix MalfaitandGitHub 7d9f9605a2 feat(settings): move email handles and emailing domains to dedicated Email page (#21008)
## Summary

Both **Email Handles** and **Emailing Domains** were rendered on the
General workspace settings page, but they're workspace-level *email
infrastructure* (inbound shared addresses + outbound sender
authentication) and don't belong with the workspace name, picture, and
domain config.

- New `SettingsWorkspaceEmail` page at `/settings/email`
- Nav item under **Workspace**, hidden when `IS_EMAIL_GROUP_ENABLED` is
off (and gated by `WORKSPACE` permission)
- Related sub-routes (`email-group/:messageChannelId`,
`emailing-domain/:domainId`, etc.) moved from `general/` to `email/` so
the URL space stays consistent with the page
- General page now only contains name, picture, workspace domain, and
the delete-workspace section

No behavior changes to the underlying section components — they're
imported as-is into the new page.

## Test plan

- [ ] With `IS_EMAIL_GROUP_ENABLED` enabled: **Email** appears in the
Workspace nav and the page renders both sections
- [ ] With the flag disabled: **Email** is hidden from nav; navigating
to `/settings/email` directly renders nothing
- [ ] General page no longer shows Email Handles / Emailing Domains
- [ ] Clicking a shared inbox row navigates to
`/settings/email/email-group/:id` (was `general/...`)
- [ ] "Add emailing domain" navigates to
`/settings/email/emailing-domain/new`

## Notes

- Pre-existing `twenty-front` typecheck error in
`FrontComponentRendererProvider.tsx` (React types mismatch between
sibling packages) reproduces on `main` and is unrelated to this PR.
2026-05-28 13:22:55 +02:00
Félix MalfaitandGitHub 7065441972 fix: refresh admin panel feature flags after toggling (#21007)
## Summary

- Add `refetchQueries` to the `updateWorkspaceFeatureFlag` mutation in
the admin workspace detail page so the toggle reflects the new value
after toggling.
- Rename `useFeatureFlagState` → `useAdminUpdateFeatureFlag` since the
hook lives under `admin-panel` and is only consumed by the admin
workspace detail page.

## Bug

In the admin panel, toggling a feature flag for a workspace other than
the admin's own workspace sent the backend mutation successfully, but
the toggle in the UI remained unchanged.

The displayed value is derived from:
```tsx
const currentWorkspaceValue =
  currentWorkspace?.id === workspaceId
    ? currentWorkspace?.featureFlags?.find((f) => f.key === flag.key)?.value
    : undefined;
const displayedValue = currentWorkspaceValue ?? flag.value;
```

When viewing a different workspace, `currentWorkspaceValue` is
`undefined` so the toggle reads `flag.value` from the
`WORKSPACE_LOOKUP_ADMIN_PANEL` query. That query was never refetched
after the mutation, so the displayed value stayed stale.

The existing optimistic Jotai update on `currentWorkspaceState` still
runs — it is needed so the rest of the app (anything consuming
`useIsFeatureEnabled`) reacts immediately when an admin toggles a flag
on their own workspace.

## Test plan

- [ ] Open the admin panel → pick a workspace that is not your own →
Feature Flags tab → toggle a flag → toggle visually flips after the
mutation completes.
- [ ] Same flow on your own workspace → toggle flips, and any UI gated
on that flag also reacts.
- [ ] If the mutation fails, the toggle reverts (existing `onError`
rollback path).
2026-05-28 12:23:26 +02:00
6e2cf4cbc0 Fix lambda timeout diagnostics (#21002)
Trying to fix
https://twenty-v7.sentry.io/issues/7420384466/?environment=prod&environment=prod-eu&project=4507072499810304&query=is%3Aunresolved%20%21issue.type%3A%5Bperformance_consecutive_db_queries%2Cperformance_consecutive_http%2Cperformance_file_io_main_thread%2Cperformance_db_main_thread%2Cperformance_n_plus_one_db_queries%2Cperformance_n_plus_one_api_calls%2Cperformance_p95_endpoint_regression%2Cperformance_slow_db_query%2Cperformance_render_blocking_asset_span%2Cperformance_uncompressed_assets%2Cperformance_http_overhead%2Cperformance_large_http_payload%5D%20timesSeen%3A%3E10&referrer=issue-stream&sort=date

## Summary
- Prevent invoking Lambda functions stuck in `Pending` state by checking
`Configuration.State === 'Active'` in `checkLambdaExecutorBuildStatus` —
a Pending function now goes through `ensureLambdaExecutor` which waits
for Active.
- Track execution phase (`build`/`fetch-code`/`invoke`) via a
`LambdaExecutionPhase` enum and include phase timing + function state in
all error messages for faster debugging.

Co-authored-by: Matt Van Horn <[email protected]>
2026-05-28 09:06:33 +00:00
de7daaa81a fix: exclude system objects and workflow/dashboard from AI/MCP write tool descriptors (#20973)
## Summary

fix: exclude system join objects from AI/MCP create/update/delete tool
descriptors

Closes #20403

---
AI was used for assistance.

---------

Co-authored-by: Matt Van Horn <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
2026-05-27 20:01:11 +02:00
c0cbe67bcd i18n - translations (#20982)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-27 19:47:07 +02:00
neo773GitHubFélix Malfaitclaude[bot] <41898282+claude[bot]@users.noreply.github.com>Félix Malfait
c5606212f2 Ses outbound followup (#20610)
This pull request unifies outbound with inbound under the new feature
and the new email groups feature.

These are workspace level shared inboxes that are shared between all
workspace members.

outbound sending with SES works, we only listen for tenant status
events, rest is managed by AWS

PR refactors old code and webhook to be split for outbound and inbound
for proper separation


| Area | Change |
|---|---|
| AWS SES driver | Split into `AwsSesRegisterDomainService` (tenant +
identity + DKIM + MAIL FROM + configuration-set + EventBridge dest +
contact list) and `AwsSesSendEmailService` (SendEmail). |
| Reputation webhook | New `/webhooks/messaging/ses/outbound` route. SES
→ EventBridge (`Sending Status Enabled/Disabled` on default bus) → SNS →
router → `SesOutboundSendingStateHandlerService` updates
`emailing_domain.tenantStatus`. |
| Inbound webhook | Refactored into `SesInboundWebhookRouterService` +
`SesInboundMailHandlerService`. Shared `SnsSignatureVerifierService` +
`SnsSubscriptionConfirmerService` across both routes. |
| Global uniqueness | New migration + instance command:
`emailing_domain.domain` is now globally unique (one tenant per domain
across workspaces). |
| Tenant status | New `emailing_domain.tenantStatus` column (`ACTIVE` /
`PAUSED`) + `EmailingDomainTenantStatusService`. |
| Send-email mutation | New `sendEmailViaDomain` GraphQL mutation +
DTOs. |
| Cleanup | `EmailingDomainWorkspaceCleanupJob` wired into
`WorkspaceService.deleteWorkspace` — tears down SES tenant association +
identity on workspace delete. |
| Settings UI | Rewritten around reusable `SettingsTableListSection`.
"Email Group" → "Email Handle" rename. New cells for
status/source/forwarding. Outbound domains surfaced on workspace
settings page. |

### Env vars (new)

All in `config-variables.ts`, group `AWS_SES_SETTINGS`, all optional:

- `AWS_SES_REGION` — `@IsAWSRegion`, consumed by `AwsSesClientProvider`
+ driver factory
- `AWS_SES_ACCOUNT_ID` — used for ARN construction in driver factory
- `SES_SNS_TOPIC_ARN_ALLOWLIST` — **shared** by inbound + outbound
webhook routers, comma-separated list of accepted SNS topic ARNs
(verified via `sns-payload-validator`)

### Migrations

- `1778862608620-add-emailing-domain-tenant-status` (fast) — adds
`tenantStatus` column.
- `1778865501791-unique-emailing-domain-globally` (slow, idempotent) —
enforces global uniqueness on `domain`.
- Instance commands bumped to `2.5`.

### Infra dependency

Two coupled twenty-infra PRs:

- `ses-inbound-email` — receipt-rule + inbound SNS topic + S3 bucket
policy + KMS grant + `email_group_*` outputs.
- `ses-outbound-tf` — EventBridge rule + outbound SNS topic + SES IAM
policy + outbound `webhook_url` subscription. **Based on
`ses-inbound-email`.**

Merge order: inbound first, then outbound. Outbound PR's chart edit owns
the comma-joined `SES_SNS_TOPIC_ARN_ALLOWLIST` value (both ARNs).


Features lives under `/settings/general`

<img width="1496" height="845" alt="SCR-20260519-ofhi-2"
src="https://github.com/user-attachments/assets/a025485a-09f7-4131-91cd-0067690ff18d"
/>

---------

Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Félix Malfait <[email protected]>
2026-05-27 19:38:44 +02:00
0702e72e3f i18n - translations (#20979)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-27 19:18:37 +02:00
martmullandGitHub 0503aa7982 Display application info in workflow side panel (#20976)
To comply this design
https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=99421-167676&t=GXw0bOgp2P51YVKi-0


## Before

<img width="569" height="470" alt="image"
src="https://github.com/user-attachments/assets/c52c8775-2934-4620-8885-dff5a8230a89"
/>


## After

<img width="314" height="258" alt="image"
src="https://github.com/user-attachments/assets/df9cbd15-cf7b-4a47-ac8d-1292c71a7c94"
/>
2026-05-27 16:57:48 +00:00
f98c5d0609 i18n - translations (#20978)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-27 19:01:41 +02:00
Félix MalfaitandGitHub 4797d2f270 feat(twenty-orm): introduce WorkspaceScopedRepository for core/metadata workspace-scoped entities (#20953)
## Summary

Adds a third tenancy enforcement layer for entities that live in shared
schemas (`core`, `metadata`) and carry a `workspaceId` column —
previously the only safeguard at this layer was developer discipline
(remembering to put `workspaceId` in every WHERE clause).

### The three layers, after this PR

| Layer | Scope | How it's enforced |
|---|---|---|
| 1. Workspace data | per-workspace schema (companies, people, custom
objects) | `twentyORMManager.getRepository(workspace, E)` — physical
isolation (own data source) |
| 2. Metadata | shared `metadata` schema (objectMetadata, fieldMetadata,
views, roles…) | Flat-entity-maps cache — workspace-scoped in-memory
map, lookups by id within it |
| 3. Core (new) | shared `core` schema (agent threads/turns/messages,
app tokens, etc.) | `WorkspaceScopedRepository<T>` — `workspaceId` is a
required positional argument on every read/write |

## What's in the PR

### The wrapper
(`packages/twenty-server/src/engine/twenty-orm/workspace-scoped-repository/`)
- `WorkspaceScopedRepository<T extends WorkspaceScopedEntity>` — wraps a
TypeORM `Repository<T>`, requires `workspaceId` on every
`find`/`findOne`/`findOneOrFail`/`update`/`delete`/`softDelete`/`insert`/`save`/`count`
call, merging it into the WHERE or stamping it on the entity.
`createQueryBuilder` is an explicit escape hatch (caller scopes
manually).
- Provided via Nest DI with
`@InjectWorkspaceScopedRepository(EntityClass)` and the
`provideWorkspaceScopedRepository(EntityClass)` provider factory.
- 19 unit tests cover the merge behavior, override-on-conflict, and the
array-where (OR) case.

### Lint enforcement
(`packages/twenty-oxlint-rules/rules/prefer-workspace-scoped-repository.ts`)
- New `twenty/prefer-workspace-scoped-repository` rule (level:
**error**).
- Blacklist of entity names: raw `@InjectRepository(E)` is rejected if
`E` is on the list.
- Initial list: `AgentTurnEntity`, `AgentMessageEntity`,
`AgentMessagePartEntity`, `AgentChatThreadEntity`,
`AgentTurnEvaluationEntity`, `AgentEntity`.
- Designed to grow over time as more consumers are migrated.
- 5 rule tests.

### Migration in this PR
All consumers of the six blacklisted entities, including:
- AI agent / chat / monitor resolvers, services, and jobs
- `AgentService`, `AiAgentRoleService`, `AiAgentWorkflowAction`,
`ApplicationService`, `WorkspaceFlatAgentMapCacheService`
- Admin-panel chat (migrated where the lookup is workspace-known; one
documented `eslint-disable` on the threadId-discovery lookup that
necessarily precedes the `allowImpersonation` permission check)
- `AiAgentRoleService` unit spec updated to mock the scoped wrapper

## Future work (deliberately not in this PR)

A standalone audit identified ~14 additional `core`/`metadata` entities
with `workspaceId` that currently use raw `@InjectRepository` and could
be added to the blacklist. Notable candidates: `UserWorkspaceEntity` (42
sites), `AppTokenEntity` (10), `FileEntity` (7),
`BillingCustomerEntity`/`BillingSubscriptionEntity` (~22 combined). Each
should be its own PR — the migration is mechanical but the surface is
wide.

## Test plan
- [x] `npx nx typecheck twenty-server` — clean
- [x] `npx nx lint twenty-server` — 0 warnings, 0 errors
- [x] `npx jest workspace-scoped-repository` — 19/19 pass
- [x] `npx nx test twenty-oxlint-rules` — 215/215 pass
- [x] `npx jest src/engine/metadata-modules/ai` — 44/44 pass
- [ ] Manual smoke: end-to-end AI agent chat send/receive (reviewer)
- [ ] Manual smoke: AI agent monitor — list turns, run evaluation
(reviewer)
- [ ] Manual smoke: admin-panel chat thread inspection (reviewer)
2026-05-27 18:52:53 +02:00
Raphaël BosiandGitHub c8b9dace72 Fix focus in front components inputs (#20961)
Fixes https://github.com/twentyhq/twenty/issues/20714

Fixes keyboard hotkey conflicts when typing inside `<input>` /
`<textarea>` elements rendered by Front Components. Editable fields
rendered through the component renderer now properly push/pop a focus
item onto Twenty's focus stack, disabling global keyboard hotkeys while
the user is typing.

## Before


https://github.com/user-attachments/assets/2003c2cb-2698-480f-aedf-bb2f30396572


## After


https://github.com/user-attachments/assets/2c7c6cb0-ecd7-4557-a77b-4d1f264345f0
2026-05-27 16:30:49 +00:00
martmullandGitHub fbae66de8a Fix error when token invalid (#20972)
## Before

<img width="914" height="519" alt="image"
src="https://github.com/user-attachments/assets/8933bf9e-d8db-4670-ad08-69e900083fc1"
/>

## After

<img width="1105" height="523" alt="image"
src="https://github.com/user-attachments/assets/d8638dbb-adee-4b7d-9d29-1a2a0185ab4f"
/>
2026-05-27 16:30:14 +00:00
46e7f23df1 fix(contact-creation): handle common email display-name shapes when auto-creating People (#20639)
## Summary

When messages are imported, Twenty auto-creates a Person record for any
recipient that doesn't exist yet. The display-name parser used at that
point is `displayName.split(' ')[0] / [1]`, which silently mangles
several common header shapes:

| Header | Old result |

|-------------------------------------------------|-----------------------------------------|
| `"Doe, John" <...>` | `firstName="Doe,"`, `lastName="John"` |
| `"John.Doe Doe" <...>` | `firstName="John.Doe"`, `lastName="Doe"`|
| `"Mary Jane Watson" <...>` | `lastName="Jane"` ("Watson" dropped) |
| `"[email protected]" <[email protected]>` (forwarder) | full address in
`firstName` |
| `"Doe, John:GROUP" <...>` (group-tag servers) |
`firstName="John:GROUP"` |

This PR rewrites `getFirstNameAndLastNameFromHandleAndDisplayName` to
handle each pattern. Behaviour in order:

1. Trim + strip wrapping quotes
2. Swap `"Last, First"` comma form
3. Fall back to handle parsing when display name contains `@` (real
names don't)
4. Split single dotted tokens (`"john.doe"` → `"John"`, `"Doe"`)
5. Preserve multi-word last names (`tokens.slice(1).join(' ')`)
6. De-synthesize dot-glued first names (`"John.Doe Doe"` → `"John"`,
`"Doe"`)
7. Strip `:XXX` trailing tag suffix from each parsed field

## Test plan

- [x] 16 new unit test cases covering each shape
(`__tests__/get-first-name-and-last-name-from-handle-and-display-name.util.spec.ts`)
- [x] Lint + typecheck clean
- [ ] No regression in the messaging import flow

---------

Co-authored-by: neo773 <[email protected]>
Co-authored-by: neo773 <[email protected]>
2026-05-27 15:49:46 +00:00
6f3541fd7c i18n - translations (#20975)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-27 17:47:07 +02:00
nitinandGitHub 863f3f29a2 Fix page layout widget tab moves (#20915)
Fixes widget moves between page layout tabs by making pageLayoutTabId
part of the flat-entity diff, so the save mutation no longer silently
drops the new tab assignment.

https://discord.com/channels/1130383047699738754/1508737039128985680
2026-05-27 15:29:12 +00:00
martmullandGitHub 9264480824 Display which remote is used when twenty-sdk runs command (#20969)
## After
<img width="669" height="186" alt="image"
src="https://github.com/user-attachments/assets/c6ce25c9-35a9-4b2f-a473-59803b8931cc"
/>
2026-05-27 15:23:17 +00:00
nitinandGitHub 5ff8c3b219 revert(navigation-drawer): unwanted desktop design changes from #20634 (#20955)
Follow-up to #20634. Removes three desktop design changes that bled in
unintentionally:

- `font-weight: regular` → restored to `medium` on nav item labels
- `MenuItemIconBoxContainer` wrap around bare icons → removed
- Section title `padding-right/top` tweak → restored to original values

Mobile-specific fixes from #20634 (slide-over drawer width, min-width
overflow fixes, breadcrumb cleanup, etc.) are preserved.
2026-05-27 15:06:45 +00:00
Thomas TrompetteandGitHub ff28547a36 tt-fix-logic-function-error-handling (#20928)
## Summary
- **Fix `callWithTimeout` timer leak**: the `setTimeout` was never
cleared when the callback resolved first, leaving orphaned timers (up to
15 minutes) in the Node.js event loop. Now uses `try/finally` with
`clearTimeout`.
- **Properly classify timeout errors**: introduced
`ExecutionTimedOutError` so the Lambda driver can throw
`LOGIC_FUNCTION_EXECUTION_TIMEOUT` instead of
`LOGIC_FUNCTION_EXECUTION_FAILED` — users now see "Function execution
timed out" instead of the generic "Function execution failed."

## Test plan
- [x] Execute a logic function normally and verify it still works
- [x] Trigger a logic function timeout and verify the error message says
"Function execution timed out" (not "Function execution failed")
- [x] Verify that a deleted logic function invocation logs a specific
"was deleted" warning
- [x] Verify no orphaned timers remain after logic function execution
completes
2026-05-27 14:32:12 +00:00
Félix MalfaitandGitHub dde6df7a26 refactor(website): replace axios with native fetch (#20967)
## Summary

Follow-up to #20966 (Stripe fetch client). axios's default Node http
adapter on workerd has the same TLS hang the Stripe SDK had — it just
doesn't surface today because all three call sites are wrapped in
\`unstable_cache(revalidate: 3600)\` and the cache is populated at build
time, so misses are rare and the failure mode is a silent \`null\` to
the layout.

This swaps the three remaining axios calls in \`twenty-website\` for
native \`fetch\` and removes axios from
\`packages/twenty-website/package.json\`. The package is still used by
other workspaces, so yarn.lock keeps the other resolution.

Touched call sites:
- \`src/lib/releases/fetch-latest-release-tag.ts\` (GitHub releases —
runs at build time, cosmetic)
- \`src/lib/community/fetch-github-star-count.ts\` (GitHub star count in
menu)
- \`src/lib/community/fetch-discord-member-count.ts\` (Discord member
count in menu)

## Test plan

- [ ] After merge + deploy: confirm GitHub star + Discord member counts
render in the site menu (non-zero, formatted)
- [ ] Confirm \`/releases\` shows the latest tag-gated visible release
notes
- [ ] No \`axios\` in worker bundle (\`grep axios .open-next/worker.js\`
should be empty)
2026-05-27 16:31:39 +02:00
DeviSriSaiCharanandGitHub 92b0e07617 fix: separate initial timeline loading from fetchMore loading state (#20896)
Fixes: #20742 

# Issue:
In the timeline activity inside the side panel, when we scroll down it
fetches more data and it displays a skeleton and after fetching finishes
the scroll position always jumps back to the top. Because of this, we
have to scroll to the bottom again to load more data.



https://github.com/user-attachments/assets/40d99df7-bdfb-4351-bc4f-baec2a035f13

## Root Cause
`useTimelineActivities` exposed a single `loading` state from
`useFindManyRecords`, which became true for both:
- Initial timeline fetch
- Pagination / fetchMore requests

`loadingTimelineActivities` becomes true whenever a network request is
triggered, including pagination requests where timeline records are
already available.

Because of this, the UI could not distinguish between the first query
loading state and subsequent fetchMore loading states.

## Fix
Added a separate firstQueryLoading state to detect only the first
timeline request.

The first query is identified by checking:

- the request is still loading
- and no timeline activities have been loaded yet

Once activities are already available, any future loading state is
treated as pagination/loading more records instead of initial loading.

This allows the UI to correctly handle:

- Skeleton loaders for first load
- Infinite scroll loaders for pagination
- Empty states after loading finishes



https://github.com/user-attachments/assets/48e8e078-82e2-43d8-823f-2f71e4f4f6e1
2026-05-27 14:20:59 +00:00
951ead5a1e fix(front): ignore IME composition Enter in input hotkeys (#20958)
## What

Pressing Enter to confirm an IME (CJK) composition no longer submits the
input. The Enter / Escape / Tab handlers now ignore key events fired
while a composition is in progress (`isComposing`, or the legacy
`keyCode === 229`).

Fixes #20954

## Why

`isComposing` was not checked anywhere in `twenty-front`, so the Enter
that confirms a Japanese / Chinese / Korean conversion was also consumed
as a submit / escape / tab hotkey — making it very hard to type CJK text
into any input that submits on Enter.

## Changes

- `useHotkeysOnFocusedElement` — central guard; covers every input wired
through `useRegisterInputEvents` (~13 components) and all hotkeys routed
through this hook.
- Direct `onKeyDown` Enter handlers: `CreateWorkspace`,
`SettingsDevelopersApiKeysNew`, `SettingsAccountsBlocklistInput`.

## Notes

- No effect on non-IME (Latin) typing — `isComposing` is only true
during an active composition. It also improves accented / dead-key input
on Latin layouts.
- `react-hotkeys-hook@4` does not handle IME composition on its own, so
the guard is explicit.

## Testing

Manually verified with a Japanese IME on Chrome (macOS) against the
v2.8.3 self-hosted image: romaji + Enter now only confirms the
conversion; a second Enter on committed text submits as expected. The
GIF in #20954 shows the original buggy behavior.

Co-authored-by: Claude Opus 4.7 <[email protected]>
2026-05-27 14:09:10 +00:00
Félix MalfaitandGitHub e79f43813b fix(website): use Stripe fetch client on Cloudflare Workers (#20966)
## Summary

Every `/api/enterprise/*` route on `twenty-website-prod` is currently
timing out at exactly 80s with `Request aborted due to timeout being
reached (80000ms)` — that's `Stripe.DEFAULT_TIMEOUT` aborting itself,
not Cloudflare.

The Stripe SDK's default transport uses Node's `http`/`https` module.
Under workerd, even with `nodejs_compat`, the outbound TLS connection to
`api.stripe.com` hangs and the SDK eventually times out at its built-in
80s ceiling. Worked on EKS (real Node), breaks on Cloudflare Workers.

Fix is one line: pass `httpClient: Stripe.createFetchHttpClient()` so
the SDK uses workerd's native `fetch` instead of the polyfilled Node
transport.

## Blast radius

`getStripeClient()` is shared across every enterprise route. All of
these are silently broken on prod right now:

- `POST /api/enterprise/checkout` (confirmed in logs)
- `POST /api/enterprise/portal`
- `POST /api/enterprise/seats`
- `GET  /api/enterprise/status`
- `POST /api/enterprise/activate`
- `POST /api/enterprise/validate`

Single change in `stripe-client.ts` unblocks all of them.

## Test plan

- [ ] After merge + deploy to prod: `wrangler tail twenty-website-prod`
while hitting the enterprise checkout flow; same call should complete in
<2s instead of 80s
- [ ] Verify a real Stripe checkout session is created (Stripe dashboard
→ Payments → Checkout sessions)
- [ ] Spot-check `/api/enterprise/status` and `/api/enterprise/portal`
are no longer timing out
2026-05-27 16:03:48 +02:00
73ab5de46c i18n - translations (#20963)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-27 14:59:02 +02:00
MarieandGitHub 986b9dcb3d Deprecate dummy enterprise key 1/2 (#20890)
Remove usage of hasValidEnterpriseKey in FE (replaced by
hasValidSignedEnterpriseKey)

To avoid breaking change at deploy time, we will wait until after this
has been deployed in prod, to remove hasValidEnterpriseKey in the BE.
2026-05-27 12:34:48 +00:00
ae7db23bdd i18n - translations (#20959)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-27 14:33:57 +02:00
WeikoandGitHub 2f358a1775 Add a Table display mode to relation field widgets (#20929)
## Context

Adds a new Table layout to the FIELD widget for to-many relation fields.
On a record page, a relation can now be displayed as a full record table
(the same component used for record indexes and dashboard table widgets)
scoped to the records related to the current record.



https://github.com/user-attachments/assets/320b24dc-f019-4d0e-bc71-3e64d032d75a



https://github.com/user-attachments/assets/2f6d4f8e-de26-4fc1-ae12-c9b9c19654dc



https://github.com/user-attachments/assets/3fb6d512-f83c-4818-823e-46ad2644fbc2
2026-05-27 12:13:58 +00:00
EtienneandGitHub fc3004b2f6 fix(website) - fix getPartners (#20947)
**Context**
Fix empty marketplace at /partners/list: page was being statically
prerendered with getPartners() returning [] (build-time fetch failure),
then served from OpenNext's R2 cache forever — so the partners API was
never actually called in production.

**Change**
Wrap getPartners in unstable_cache with revalidate: 300, matching the
existing fetchGithubStarCount / fetchDiscordMemberCount ISR pattern.
After deploy, the cached empty result expires within 5 minutes and the
worker refetches from the partners API at runtime (where the env vars
actually exist), populating the page. Also drops the now-redundant
cache: 'no-store' from partnersApiFetch.
2026-05-27 10:53:17 +00:00
086b79e5b9 i18n - translations (#20952)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-27 11:02:42 +02:00
Félix MalfaitandGitHub 8cb88cabee fix(role): rebind API keys + agents before deleting their role (#20935)
## Customer-reported bug

A customer hit this when using the AI chat:

```json
{
  "message": "API key 760d4822-da40-4b3f-9031-40563d7ed6c9 has no role assigned",
  "extensions": {
    "code": "INTERNAL_SERVER_ERROR",
    "userFriendlyMessage": "This API key has no role assigned."
  }
}
```

Their integration authenticates via API key. Somewhere along the way,
the role bound to that API key was deleted, leaving the API key
authenticated but role-less. Any request that hits a permission check
(`getRoleIdForApiKeyId`) blows up.

## Root cause

In `RoleService.deleteManyRoles`, the pre-deletion cleanup
(`assignDefaultRoleToMembersWithRoleToDelete`) only rebinds **user
workspaces** to the workspace default role. API keys and agents pointing
at the role are ignored. Because `RoleTargetEntity.role` declares
`onDelete: 'CASCADE'`, the FK then drops the role_target rows for those
API keys / agents — but the API keys themselves stay in `api_key`, now
orphaned in `apiKeyRoleMap`.

A previous read-side workaround
([2767ddac44](https://github.com/twentyhq/twenty/commit/2767ddac44) —
make the `role` ResolveField nullable) handled the API-key-details page,
but did not address the write paths (`getRoleIdForApiKeyId`).

## Fix

- Rename `assignDefaultRoleToMembersWithRoleToDelete` →
`rebindTargetsOfRoleToDeleteToDefaultRole` and extend it to rebind API
keys (via `ApiKeyRoleService.assignRoleToApiKey`) and agents (via
`AiAgentRoleService.assignRoleToAgent`) in the same step, before the
role is deleted.
- If the workspace default role doesn't satisfy `canBeAssignedToApiKeys`
/ `canBeAssignedToAgents`, the inner `assignRoleTo*` validation throws.
We catch that and rethrow as a `PermissionsException` with a
role-deletion-context message and two new codes —
`ROLE_CANNOT_BE_ASSIGNED_TO_API_KEYS` /
`ROLE_CANNOT_BE_ASSIGNED_TO_AGENTS` — so the admin sees a clear
"reassign these first" prompt rather than a confusing inner error.

## Scope / non-goals

- **Already-orphaned API keys are not auto-healed.** The customer still
needs to reassign a role to their existing orphan API key via the UI
(Settings > API Keys > [the key] > role). A separate cleanup command for
existing orphans is a follow-up.
- I did not investigate *why* the customer's session was authenticated
via API key in the AI chat — that may be their integration setup. Worth
confirming with them separately.

## Test plan

- [ ] Workspace with default role `Admin` (which has
`canBeAssignedToApiKeys: true`): create an API key with a custom role,
delete the custom role → API key is rebound to Admin, requests keep
working.
- [ ] Workspace with default role `Member` (default, has
`canBeAssignedToApiKeys: false`): create an API key with a custom role,
delete the custom role → role deletion fails with the new
`ROLE_CANNOT_BE_ASSIGNED_TO_API_KEYS` error explaining the admin must
reassign first. API key + custom role are both unchanged.
- [ ] Same two scenarios for agents (`canBeAssignedToAgents`).
- [ ] Existing user-workspace rebind behavior is unchanged.
- [ ] Role deletion with no dependent API keys / agents still works.
2026-05-27 10:54:02 +02:00
Félix MalfaitGitHubclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
ac89d2ff56 feat: raise FILES field max number of values from 10 to 60 (#20950)
## Summary

Raises the artificial hardcoded ceiling on `maxNumberOfValues` for
custom FILES fields from `10` to `60` so users can attach more files per
record.

- Bumped `FILES_FIELD_MAX_NUMBER_OF_VALUES` constant in `twenty-shared`
from `10` to `60`
- Updated validator unit test (inline snapshots + "exceeds max" case)
- Updated create/update files-field metadata integration tests and Jest
snapshots

The frontend Zod schema only enforces a `min`, so no frontend changes
are required — the backend constant is the single source of truth for
the upper bound.

Refs #20942

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2026-05-27 10:53:09 +02:00
423faa6153 i18n - translations (#20951)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-27 10:40:15 +02:00
martmullandGitHub a051490ec9 Basic app logo fixes (#20919)
as title, took the quick win fixes from
https://github.com/twentyhq/twenty/pull/20909/changes#diff-3367344412b2f44f0273d8019c1bc36396198244b9558d02921b135f62522baaR180
and leave the main fix for later as it requires an architectural update
2026-05-27 08:21:35 +00:00
34db7ac8b4 chore: sync AI model catalog from models.dev (#20948)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <[email protected]>
2026-05-27 09:19:32 +02:00
EtienneandGitHub 4a82cddad6 remove ai-model-preferences var env and config (#20859)
Split the single AI_MODEL_PREFERENCES JSON config into 4 array configs
and migrates existing workspace data.
2026-05-27 06:47:47 +00:00
Abdullah.andGitHub 9d6c5b7d58 [Website] Restore shared build dependency for typecheck (#20936)
Should fix the CI failure on `typecheck` by building twenty-shared
first.
2026-05-26 19:33:04 +02:00
Paul RastoinandGitHub a2db0b6932 Fix index cache computation (#20933)
## Introduction
Should rely on custom typeorm entity loader layer that inspects the
upgradeMigration that has bene run to dynamically request existing col
only
2026-05-26 18:55:24 +02:00
EtienneandGitHub 5eb79e7797 fix(billing) - fix orphaned stripe subs 2/2 (#20916)
Fixes https://sonarly.com/issue/40688

Should have been included in
https://github.com/twentyhq/twenty/commit/0edd8d400c646cd6a40ff0fea5342a0f61645d5e
2026-05-26 16:28:21 +00:00
Paul RastoinandGitHub f19647617a Fix cross version upgrade for 2.8 (#20927) 2026-05-26 15:46:06 +00:00
Thomas TrompetteandGitHub 424c6737a1 Fix workflow step output schema not reflecting user-renamed step name (#20922)
## Summary
- Fixes https://github.com/twentyhq/twenty/issues/20906
- Moves `markStepForRecomputation` from `useUpdateStep` into the
lower-level `useUpdateWorkflowVersionStep` hook, so **every** caller
that updates a step also triggers output schema recomputation.
- Previously, renaming a step via the side panel title input called
`useUpdateWorkflowVersionStep` directly (bypassing `useUpdateStep`), so
the variable picker kept showing the initial default name (e.g. "Create
Record") instead of the user's custom name.

## Test plan
- [x] Rename a workflow step via the side panel title input
- [x] Verify the variable picker dropdown shows the updated name
- [x] Verify variable tags/chips in subsequent steps reflect the updated
name
- [x] Verify that updating step settings (e.g. changing object type)
still refreshes the output schema correctly
2026-05-26 15:38:36 +00:00
be8c25dfc2 i18n - translations (#20930)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-26 17:46:04 +02:00
Paul RastoinandGitHub b8de469f37 Refactor and centralize file mimeType integrity check and sanitization (#20889)
# Introduction
closes https://github.com/twentyhq/private-issues/issues/484

This PR refactors the writeFile API to never expect to be passed a
mimetype, its extract is done programmatically low level so any callers
will pass through
Same for the file sanitization

## IANA override
Disclaimer for consistency we existing behavior we wanted to always have
`application/typescript`
- should we rather consider fallbacking to octect-steam instead ?
- Any pulbic assets that has .ts will now also fallback to
`application/typescript` instead of the official IANA

## Integration
Added coverage
2026-05-26 15:10:52 +00:00
c74337978b i18n - docs translations (#20926)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-26 17:25:43 +02:00
059e75e532 chore: bump version to 2.9.0 (#20925)
## Summary

- Moves current version to previous versions array
- Sets TWENTY_CURRENT_VERSION to the new version
- Updates TWENTY_NEXT_VERSIONS with the next minor version
- Bumps twenty-client-sdk, twenty-sdk, and create-twenty-app to the same
version

## Checklist

- [ ] Verify version constants are correct
- [ ] Verify npm package versions match

Co-authored-by: Github Action Deploy <[email protected]>
2026-05-26 17:14:22 +02:00
bb5c2bd00c Fix/restore channel association scalar field metadata (#20920)
[#20836](https://github.com/twentyhq/twenty/pull/20836) dropped the
channel objects but even though
calendarChannelId/messageChannelId/messageFolderId already existed in
compute standard flat field, there was never an upgrade command to readd
them on the surviving association objects

so existing workspaces lost the field metadata (columns survived) and
import workers throw
```Error: Unknown error importing calendar events for calendar channel <REDACTED> in workspace <REDACTED>: Query runner already released. Cannot run queries anymore.```

This PR adds that command

---------

Co-authored-by: prastoin <[email protected]>
2026-05-26 14:58:33 +00:00
a2673da164 i18n - translations (#20924)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-26 17:03:31 +02:00
WeikoandGitHub 08682fb3f5 Various fixes - some AI findings (#20921)
App permissions tab:
- The fallback uuidv4() for a marketplace field was generated twice, so
id and universalIdentifier could diverge; it's now computed once and
reused as it seemed to be the intention (even though I don't really
think it's a good idea)
- Renamed buildobjectMetadataItemsFromMarketplaceApp →
buildObjectMetadataItemsFromMarketplaceApp to follow camelCase.

Morph relation validation:
- Fixed the user-facing message "At least one relation is require" →
"...is required"
- Typos in the related test descriptions (Morh → Morph, samefield → same
field) and their snapshots.

Docs
- The UUID field-type row in views.mdx only listed IS; updated to the
full set supported by FILTER_OPERANDS_MAP (IS, IS_NOT, IS_EMPTY,
IS_NOT_EMPTY).
2026-05-26 14:43:50 +00:00
53d4e92dda [Website] Generate release notes manifest at build time (#20913)
Removed the releases page’s runtime dependency on `fs` and
`process.cwd()` by introducing a build-time manifest generator: release
notes still live as markdown under `src/content/releases`, but a new
script now parses their frontmatter/content, validates that each note
has a release, title, and preview image (and that the image actually
exists), sorts the notes, and emits a typed `generated-release-notes.ts`
file that the app imports at runtime.

Updated the releases loader to return that generated data, changed the
menu releases preview and release JSON-LD to use explicit typed fields
(`title`, `previewImage`) instead of scraping markdown with regex at
runtime, wired the generator into Nx so it runs automatically before
`dev`, `build`, and `typecheck`, and fixed two stale image references in
the release MDX files that the new validation exposed.

---------

Co-authored-by: prastoin <[email protected]>
2026-05-26 16:46:11 +02:00
Rashad KaranouhandGitHub 53392f9a16 feat(twenty-partners): partnerContent catalog + TFT import improvements (#20904)
## Summary

Two related threads for the internal `twenty-partners` app:

1. **Redesign `partnerQuote` → `partnerContent`.** The object was
mis-modeled as a sales/pre-invoice doc (`amount`, opportunity link). In
TFT it's actually a marketing-content catalog — customer quotes, case
studies, partner quotes, logos — moving through a production lifecycle.
This renames it in place and reshapes it to mirror TFT's
`CustomerContent`.
2. **Import tooling improvements** to the TFT importer + multi-env
workflow.

## Changes

**Schema (`partnerContent`)**
- Rename `partnerQuote` → `partnerContent` (object, view, nav, relation
fields, identifiers).
- Add `contentType` MULTI_SELECT `[CUSTOMER_QUOTE, CASE_STUDY,
PARTNER_QUOTE, LOGO]` and `interview` LINKS.
- Add `customerCompany` / `customerPerson` relations; keep `partner`;
drop the `opportunity` link (TFT has none).
- Drop `amount`; rename the FILES field `quoteFile` → `documents`
(`attachments` is a reserved morph-relation name).

**Importer (`import-from-tft.ts`)**
- Import the full content catalog (all types), not just `PARTNER_QUOTE`.
- Map TFT `partnerTimezone` → `region`, default
`languagesSpoken=[ENGLISH]`, and set `deploymentExpertise=[SELF_HOST]`
when scope includes `HOSTING_ENVIRONMENT`.
- Filter to partner-relevant records only: opportunities linked to a
partner (20 of 164), content linked to a partner (10 of 22). Drops
general sales-pipeline / customer-only noise.
- Dedupe companies by **normalized domain** (Twenty's unique key), not
just name — fixes duplicate-entry crashes when the same company arrives
under different names.
- Progress logging throughout.

**Tooling**
- `purge-soft-deleted` script (soft-deleted rows block re-imports via
unique constraints).
- Multi-env script variants (`*:prod`) selected via `ENV_FILE`.

## Testing

Verified on a local Twenty instance and on `partner.twenty.com`:
- 122 partners, 20 partner-linked opportunities, 10 partner-linked
content (all types), 229 domain-deduped companies.
- Schema confirmed via metadata introspection; `yarn twenty typecheck`
clean.

## Notes

- Renaming an installed object isn't a pure in-place migration on a
server that already had `partnerQuote` — the working path is `uninstall
→ deploy → install` (safe here: prod had no data).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-26 14:09:57 +00:00
7e7bb81586 i18n - translations (#20911)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-26 12:13:49 +02:00
3703b3e2f6 i18n - translations (#20910)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-26 12:06:57 +02:00
Charles BochetandGitHub e72d10f550 chore(security): bump esbuild to ^0.28.0 to clear CVE-2025-68121 (CVSS 10.0) (#20902)
## Summary

Follow-up to #20876. That PR bumped `esbuild` to `^0.27.3` to address
the Go-stdlib CVEs the self-hoster reported, but only one of the two Go
CVEs is actually fixed at that level. This PR closes the remaining gap.

### Why 0.27.3 wasn't enough

`esbuild` ships a Go-built binary inside the `@esbuild/<platform>`
packages. The vulnerability lives in the bundled Go toolchain, not in
any JavaScript. Verified by reading the Go `buildinfo` section from
`node_modules/@esbuild/<platform>/bin/esbuild`:

- `[email protected].7` → built with **Go 1.23.8**
- `[email protected].0` → built with **Go 1.26.1**

CVE-2024-24790 (IPv6 zone parsing) is fixed in Go 1.21.11 / 1.22.4, so
0.27.x covers it.

**CVE-2025-68121** (crypto/tls cert validation bypass via TLS session
resumption, **CVSS 10.0 / Critical** per
[NVD](https://nvd.nist.gov/vuln/detail/cve-2025-68121)) is fixed only in
Go 1.24.13, 1.25.7, and 1.26.0-rc.3+. Go 1.23.x is past Go's support
window and will not receive this fix. So `[email protected].x` still ships a
Go binary that Trivy correctly flags as vulnerable.

### Reachable risk in Twenty

Low. `esbuild` does not use `crypto/tls` at runtime — it reads files,
parses, transforms, and writes. The vulnerable code path is dead code
inside the binary, present but never executed. The scan finding is what
we are clearing, not an exploitation risk.

### Fix

Bump `twenty-client-sdk`'s `esbuild` from `^0.27.3` to `^0.28.0`
(resolves to 0.28.0, built with Go 1.26.1).

### Verification

Ran `yarn workspaces focus --production twenty twenty-server
twenty-emails twenty-shared twenty-client-sdk` (the same install the
Dockerfile uses) and confirmed:

- `node_modules/esbuild/` resolves to `[email protected].0` (single copy)
- The bundled `node_modules/@esbuild/<platform>/bin/esbuild` binary
reports `go1.26.1` in its `buildinfo`

## Test plan

- [x] `nx typecheck twenty-server` passes
- [x] `nx build twenty-client-sdk` passes (esbuild's `build()` API is
stable across 0.27 → 0.28)
- [x] Production focus install shows Go 1.26.1 in the shipped binary
- [ ] CI green
- [ ] Re-run Trivy against the resulting image; confirm CVE-2025-68121
no longer appears
2026-05-26 09:49:25 +00:00
martmullandGitHub 7ca9081efa Add application installation validation modale (#20907)
## After

<img width="1512" height="829" alt="image"
src="https://github.com/user-attachments/assets/231d4f0d-6052-4c4e-9a2a-0244d2b3832e"
/>
2026-05-26 09:48:31 +00:00
015dca95fc Edit actor chip icon style & read-only behavior (#18552)
https://github.com/user-attachments/assets/925f4380-e3e2-430d-a8e3-7e1242298900

Removed background color from icons for consistency
Removed chip hover state as chips are not navigable
Updated read-only design (text/secondary on chip hover)

---------

Co-authored-by: Félix Malfait <[email protected]>
2026-05-26 09:38:39 +00:00
Paul RastoinandGitHub 076c05cbd0 File service uniformize not found behavior and stream management (#20891)
# Introduction

closes https://github.com/twentyhq/private-issues/issues/485
2026-05-26 09:23:48 +00:00
Félix MalfaitandGitHub 82c565f7dc perf(website): cache prerendered pages in CF Cache API (withRegionalCache) (#20905)
## Summary
Recovers most of the TTFB the EKS→Cloudflare migration lost on
`twenty.com`. OpenStatus's P50 chart shows the regression clearly: TTFB
went from ~50–80ms (pre-migration, CF edge cache HIT) to ~250–350ms
(post-migration, every request hits Worker → R2 → respond).

## Why the existing Cache Rule stopped working
The zone-level `Twenty Website - Aggressive cache` Cache Rule was
correctly configured and was the reason pre-migration TTFB was low. It
still exists, still has `cache: true`, Edge TTL 1d. But it doesn't apply
to Worker responses on a Worker custom domain:

- **Pre-migration** request flow: `edge → Cache Rule lookup → HIT
(~20ms) / MISS → origin → cache the response`
- **Post-migration**: `edge → Worker runs first (custom domain) → Worker
generates synthetic response from R2 → return`

Cache Rules cache responses obtained via `fetch()` from the Worker, not
synthetic responses constructed inside the Worker. OpenNext for SSG
pages reads prerendered HTML from R2 and returns it — that's synthetic.
So the rule has no insertion point.

This is structural to how CF Workers handle custom domains; not a
misconfiguration on your side.

## The fix
`open-next.config.ts`:
```ts
const incrementalCache = withRegionalCache(r2IncrementalCache, {
  mode: 'long-lived',
});
const baseConfig = defineCloudflareConfig({ incrementalCache });
```

OpenNext-native wrapper. The Worker still runs per request (~5–20ms
execution), but the ISR cache lookup goes through CF's per-region Cache
API (~5–20ms) instead of R2 (~50–150ms). For pages whose prerender
doesn't change between requests, that's the bulk of the TTFB recovered.

## Measured impact (live before/after on twenty.com today)
| URL | Before (avg of 3) | After cold (first 2 hits/region) | After
warm |
|---|---|---|---|
| `/` | 322ms | 600–640ms | **110–125ms** |
| `/pricing` | 267ms | 630–690ms | **104–110ms** |
| `/why-twenty` | 250ms | 175–270ms | **100–175ms** |

First 1–2 hits per CF region after this deploys will be slower than
baseline (regional Cache API populating from R2), then it sustains.
Steady state is significantly better than pre-fix.

## What this doesn't recover
Pre-migration `cf-cache-status: HIT` was ~20–30ms because the Worker
wasn't invoked at all. We can't get there without either:
- Moving SSG hosting off the Worker (back to a static origin Cache Rules
would cover)
- OpenNext gaining a "publish responses to caches.default" mode (doesn't
exist today)

Realistic-best on CF Workers + OpenNext is around the ~80–130ms range
we're now seeing.

## Live state
Already deployed to both prod (Version `40dfaa1a-...`) and dev (Version
`b45cc2de-...`) ahead of opening this PR, so the OpenStatus chart should
start improving immediately. This PR makes `main` reflect the change.
2026-05-26 09:20:55 +02:00
martmullandGitHub 44bae39538 Publish new cli tool version (#20903)
publish 2.8.0
2026-05-26 07:06:04 +00:00
WeikoandGitHub 1188ea9cd5 chore(server): remove unused REST→GraphQL HTTP bridge (#20897)
## Summary

Removes the unused `RestApiService` HTTP bridge that posted to
`/graphql` and `/metadata` from inside the server.
2026-05-25 19:56:32 +00:00
f721420705 i18n - docs translations (#20898)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-25 20:50:59 +02:00
96d247e94d i18n - translations (#20895)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-25 19:20:56 +02:00
WeikoandGitHub 90f711361c Add definePermissionFlag for app-defined permission flags (#20887)
## Context
Adds the SDK plumbing for apps to declare custom permission flags and
the server-side manifest pipeline to persist them.

```typescript
import { definePermissionFlag } from 'twenty-sdk/define';

export const MANAGE_INVOICES_PERMISSION_FLAG_UNIVERSAL_IDENTIFIER = '…';

export default definePermissionFlag({
  universalIdentifier: MANAGE_INVOICES_PERMISSION_FLAG_UNIVERSAL_IDENTIFIER,
  key: 'MANAGE_INVOICES',
  label: 'Manage Invoices',
  description: 'Create, edit, and delete invoices',
  icon: 'IconReceipt',
});
```

```typescript
import { defineApplicationRole, SystemPermissionFlag } from 'twenty-sdk/define';
import { MANAGE_INVOICES_PERMISSION_FLAG_UNIVERSAL_IDENTIFIER } from './permission-flags/manage-invoices';

export default defineApplicationRole({
  universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER,
  label: `${APP_DISPLAY_NAME} default function role`,
  // ...
  permissionFlagUniversalIdentifiers: [
    SystemPermissionFlag.UPLOAD_FILE,
    MANAGE_INVOICES_PERMISSION_FLAG_UNIVERSAL_IDENTIFIER,
  ],
});
```

The flag can then be referenced by UUID in a role's
permissionFlagUniversalIdentifiers. On sync, the catalog row lands in
core.permissionFlag and the link in core.rolePermissionFlag.

## Not in this PR
- Runtime permission checks.
PermissionsService.getUserWorkspacePermissions still builds its result
from Object.values(PermissionFlagType), so custom flags are stored but
not yet enforced, code asking "does this role have MANAGE_INVOICES?"
won't get a meaningful answer. Widening PermissionsService and
UserWorkspacePermissions.permissionFlags to support arbitrary flag keys
is the next PR.
- PermissionFlag from apps can only define "tool" permissions and not
"settings" as a permissionType, this parameter is not mutable. This is
because "settings" are for settings page (until we might decide to
separate both type of permissions into 2 different entities) and apps
can't declare settings page or interact with them so this parameter
would be unnecessary.
2026-05-25 16:53:37 +00:00
98d47d0dd0 i18n - docs translations (#20893)
Created by Github action

Co-authored-by: github-actions <[email protected]>
2026-05-25 19:02:12 +02:00
f613886511 fix(localization): parse date-only ISO strings as local midnight in relative date formatter (#20630)
## Summary

Fixes #19634

### Root Cause

The ECMAScript spec treats date-only strings (`YYYY-MM-DD`) as **UTC
midnight** when passed to `new Date()`. But `date-fns` comparison
functions (`isToday`, `isYesterday`, `isTomorrow`) operate in **local
time**. For users in UTC-negative timezones, UTC midnight April 14 is
April 13 evening locally — so the label shows "Yesterday" instead of
"Today".

### Fix

In `formatDateISOStringToRelativeDate.ts`, detect date-only strings
(length === 10) and append `T00:00:00` (no `Z`) to force local-time
parsing:

```ts
// Before
const targetDate = new Date(isoDate);

// After
const targetDate =
  isoDate.length === 10 ? new Date(isoDate + 'T00:00:00') : new Date(isoDate);
```

Full datetime strings (with time component) are left unchanged — they
already carry timezone information.

### Tests

Added `formatDateISOStringToRelativeDate.test.ts` covering:
- `Today` / `Yesterday` / `Tomorrow` labels for date-only strings
- Regression case: date-only string parsed at local midnight (not UTC
midnight)
- Full datetime strings continue to work as before

## Before / After

| Scenario | Before | After |
|---|---|---|
| `"2026-04-14"` viewed at UTC-5 on April 14 | Yesterday  | Today ✓ |
| `"2026-04-14"` viewed at UTC+0 on April 14 | Today ✓ | Today ✓ |
| `"2026-04-14T12:00:00Z"` | Today ✓ | Today ✓ |

---------

Co-authored-by: Marie Stoppa <[email protected]>
2026-05-25 15:54:36 +00:00
a3e41ec267 i18n - translations (#20892)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-25 17:54:07 +02:00
Félix MalfaitandGitHub d602f35cbd feat(data-model): custom-indexes management UI and mutations (#20846)
## Summary

Brings indexes management into the per-object Settings tab as a section
under Search (no feature flag, advanced mode only). Admins can create /
delete non-unique indexes with the UI; apps can declare indexes in code
with `defineIndex`. Composite-typed fields are now indexable by picking
a specific sub-column (e.g. `Address > City`).

A few related polish items also land here (invite-user dropdown lands on
the Invite tab; standard warning callout above the new-index form).

## What ships

### UI — custom indexes on per-object Settings
- New section directly under Search, wrapped in
`AdvancedSettingsWrapper`.
- Filter dropdown on the search bar toggles system-index visibility
(shown by default since advanced mode).
- **+ Add Index** button (disabled with tooltip once the per-object cap
is reached) navigates to a dedicated `SettingsObjectNewIndex` page
(matches the field-creation pattern, not a modal):
- Field picker mirrors the webhook event-form layout (rows of dropdowns,
implicit trailing empty row).
- Composite fields surface their sub-properties (`Address > City`,
`Currency > Amount`, …).
  - BTREE / GIN type selector.
- Standard warning Callout: "Use indexes sparingly — each one speeds
reads but slows writes."
- Trash icon on `isCustom: true` rows → confirmation modal →
`deleteOneIndex`.

### Server — `createOneIndex` / `deleteOneIndex` mutations
- Gated by `SettingsPermissionGuard(DATA_MODEL)`.
- `IndexMetadataService` wraps the existing migration runner via
`WorkspaceMigrationValidateBuildAndRunService` so the metadata row and
the SQL index land atomically.
- Validation: rejects empty fields, duplicate `(fieldMetadataId,
subFieldName)` pairs, fields not on the object, requires `subFieldName`
for composite parents, forbids `subFieldName` on scalar/relation,
enforces `MAX_CUSTOM_INDEXES_PER_OBJECT = 10`.
- Delete refuses on `isCustom: false` rows so system indexes can't be
removed via this API.
- Dedicated GraphQL exception handler maps each typed error to the right
transport error class.

### Composite sub-field indexing
- Adds `subFieldName: string | null` column to
`IndexFieldMetadataEntity` (fast instance command).
- The flat-entity flow (`UniversalFlatIndexFieldMetadata`,
`FlatIndexFieldMetadata`, `from-universal-flat-index-to-flat-index`,
runner column resolution) all carry `subFieldName` through.
- For composite parents, the runner uses
`computeCompositeColumnName({...}, property)` for the picked sub-column;
for non-composite parents, behavior is unchanged.
- The `'::'` separator encodes `(fieldMetadataId, subFieldName)` for
dedup on the wire; the frontend uses the same separator inside the
Select component's string value.

### Apps can declare indexes in code (`defineIndex`)
- New `IndexManifest` + `IndexFieldManifest` types in
`twenty-shared/application` wired into the `Manifest` type.
- `defineIndex` SDK helper + `IndexConfig`. CLI manifest builder +
extractor recognize `defineIndex` / `ManifestEntityKey.Indexes`.
- Server: `from-index-manifest-to-universal-flat-index` converter
resolves field IDs, validates composite/scalar `subFieldName` rules, and
delegates to `generateFlatIndexMetadataWithNameOrThrow` for the
deterministic name.
- Orchestrator wires the loop after the field-resolution pass;
per-object cap enforced inline against the manifest.
- Cascade on uninstall is automatic — when an app disappears its indexes
drop with it (universal-flat-entity diff handles it).
- Rich-app fixture ships a real `defineIndex` on `PostCard.status`,
exercising the full manifest → install path in CI.

### Closed for now (open later if needed)
- Apps cannot declare `isUnique` indexes — unique constraints stay with
the field-creation flow.
- Apps cannot use a partial-`indexWhereClause` — the UI surface keeps
the framework's hardcoded allowlist.
- UI cannot create unique or partial indexes either; same reasons.

### Cleanups along the way
- Reused the existing `getCompositeSubFieldLabel` +
`COMPOSITE_FIELD_SUB_FIELD_LABELS` (deleted the duplicates I'd created
early in the PR).
- Moved `MAX_CUSTOM_INDEXES_PER_OBJECT` to `twenty-shared/constants`
(single source for FE + BE).
- Replaced inline `isDefined(x) && x !== ''` with `isNonEmptyString`
(from `@sniptt/guards`).
- Hoisted the per-object fields Map + inlined the cap counter into the
indexes orchestrator loop (drops the install scan from O(indexes ×
totalFields) to O(totalFields + indexes)).
- Per design-feedback: page-based create flow (not a modal), filter
dropdown on the SearchInput (not a separate toggle), webhook-style
picker, field icons.

### Unrelated polish that lands here
- "Invite user" link in the multi-workspace dropdown now lands on the
Invite tab directly (`#invite`) instead of the first tab of the members
page.

## Test plan
- [ ] `npx nx typecheck twenty-server / twenty-front / twenty-sdk /
twenty-shared` — passes
- [ ] `npx nx lint:diff-with-main twenty-server / twenty-front` — clean
- [ ] `npx jest index-metadata.service.spec` — green
- [ ] `npx jest from-index-manifest-to-universal-flat-index` — green
(new converter spec, 8 cases)
- [ ] `npx vitest run
src/sdk/define/indexes/__tests__/define-index.spec.ts` (twenty-sdk) —
green (6 cases)
- [ ] `npx vitest run --config vitest.integration.config.ts -t
"rich-app"` — green (rich-app app-dev integration exercises the new
manifest path with the PostCard.status index)
- [ ] Advanced mode → Settings → any object → Settings tab → Indexes
section is visible under Search
- [ ] Create a single-field BTREE index, confirm SQL index exists
(verify via `pg_indexes`)
- [ ] Create a composite-field index (`Address > City`) and confirm the
column is `addressAddressCity`
- [ ] Create an index spanning two columns; column order matches the
picker order
- [ ] Attempt to create an 11th custom index → button is disabled with
tooltip
- [ ] Delete a custom index → confirmation modal → row disappears, PG
index dropped
- [ ] System indexes have no trash icon and are hidden by default
2026-05-25 17:47:09 +02:00
Paul RastoinandGitHub 69d89f8cfc Early return in public assets (#20881)
# Introduction
Related https://github.com/twentyhq/twenty/issues/20879

More abstracted response error and cleaner integrity check before
performing any in database search
Nothing critical patched here

Also added integration coverage to the related endpoint

Fixed the stream on error throw that would have been bubbling up into
node process

## Next
Once this has been approved will re-apply to all the existing prone
file.getBy* methods and controllers endpoints
2026-05-25 14:17:32 +00:00
Charles BochetandGitHub be39702fd2 chore(security): bump protobufjs and esbuild to clear CVEs (#20876)
## Summary

A self-hoster reported that Trivy blocks the `twentycrm/twenty:v2.7.x`
image on three fixed-critical CVEs. The reachable risk is low (none of
the vulnerable code paths are exposed to attacker-controlled input in
our deployment), but the findings are real and easy to clear by bumping
the affected dependencies in their owning workspaces.

### CVE-2026-41242 — `protobufjs` < 7.5.5

Pulled transitively into the production image via
`@opentelemetry/sdk-node`, `@opentelemetry/auto-instrumentations-node`,
and `@grpc/grpc-js` → `@grpc/proto-loader`. Lockfile was on 7.5.3; this
matches dismissed dependabot alert #1009 (Critical 9.4).

**Fix:** add `protobufjs: ^7.5.5` as a direct dep of `twenty-server`
(the workspace that exercises it via the OpenTelemetry gRPC exporters)
and run `yarn dedupe protobufjs` to collapse the residual transitive
7.5.3 copy. Resolves to 7.6.0.

### CVE-2024-24790 and CVE-2025-68121 — Go stdlib in bundled binaries

Present in the Go-built `bin/esbuild` shipped by `@esbuild/<platform>`
packages. Two paths put esbuild into the production image:

1. `twenty-client-sdk` declares `esbuild` as a runtime dep (used by its
`./generate` entry point).
2. `twenty-server` had `@lingui/vite-plugin` in `dependencies`, which
pulls `@lingui/cli` as a runtime sub-dep, which bundles `[email protected].5`
nested under `node_modules/@lingui/cli/node_modules/esbuild/`.

**Fix:**
- Bump `twenty-client-sdk`'s `esbuild` from `^0.25.0` to `^0.27.3`
(resolves to 0.27.7, built with patched Go).
- Move `@lingui/vite-plugin` from `dependencies` to `devDependencies` in
`twenty-server`. The plugin is not imported by any source file — it was
misclassified.

### Verification

Ran `yarn workspaces focus --production twenty twenty-server
twenty-emails twenty-shared twenty-client-sdk` (the same command the
Dockerfile uses) and inventoried the resulting `node_modules`. After all
three changes:

- `node_modules/esbuild/` → **0.27.7 only** (Go-patched)
- `node_modules/protobufjs/` → **7.6.0 only** (CVE-patched)

No nested copies of either package remain in the production install.

### Follow-up worth tracking separately

`esbuild` should arguably not be in `twenty-client-sdk`'s `dependencies`
at all — only the `./generate` entry point uses it, and the server never
imports that entry. Moving it to optional `peerDependencies` would stop
shipping a Go binary into the production image entirely. Out of scope
for this PR.

## Test plan

- [x] `yarn install` succeeds; `protobufjs` and `esbuild` each resolve
to a single version in production focus
- [x] `nx build twenty-client-sdk` passes
- [x] `nx typecheck twenty-server` passes
- [x] `nx build twenty-server` passes
- [x] Production focus install confirmed clean (`node_modules/esbuild`
and `node_modules/protobufjs` both single-version, both patched)
- [ ] CI green
- [ ] Re-run Trivy against the resulting image; confirm the three CVEs
no longer appear
2026-05-25 12:36:53 +00:00
EtienneandGitHub 50c8834e21 fix(billing) - skip redundant cap writes (#20882)
fixes https://sonarly.com/issue/40207
2026-05-25 12:03:18 +00:00
d54caf10c1 i18n - translations (#20885)
Created by Github action

---------

Co-authored-by: github-actions <[email protected]>
2026-05-25 14:10:10 +02:00
nitinandGitHub 0b38b4ffc4 fix(page-layout): respect tab layoutMode on standalone pages (#20856)
Standalone-page tabs with `layoutMode: CANVAS` were silently rendering
as GRID (border, padding, scroll). Now they render full-bleed, matching
the CANVAS contract elsewhere.

Three layered fixes:
- `getTabLayoutMode`: respect `tab.layoutMode` for `STANDALONE_PAGE`
(was hardcoded to GRID for any non-`RECORD_PAGE`)
- `getWidgetCardVariant`: CANVAS now wins regardless of page type —
refactored to early-return + exhaustive switch on `pageLayoutType`
- `FrontComponentWidgetRenderer`: removed hardcoded `overflow: auto`
(workflow/tasks/timeline widgets don't have it either)

New `getTabLayoutMode.test.ts`. Variant tests refactored to declarative
+ parameterized.

QA:

<img width="3024" height="1654" alt="CleanShot 2026-05-22 at 20 46
50@2x"
src="https://github.com/user-attachments/assets/cc61d459-6bc6-48de-ac79-d63a2ccd8957"
/>


https://github.com/user-attachments/assets/a3374e18-ad1b-4888-ab2b-d07730edccac
2026-05-25 11:59:31 +00:00
Paul RastoinandGitHub b8b115f4e3 FileStorageService Dedicated file and folder code flow + integrity check (#20831)
# Introduction

Next handling mimetype integrity check and checksum integrity check for
s3 storage type

Always expecting a trailing end slash when deleting a folder etc

## Application
Uninstalling an application now deletes all its related files

## File storage service
Making a distincton between folder path and file path

## Validation Pipeline

Every file operation in `FileStorageService.buildOnStoragePath` runs
through `validateResourcePath`, which chains three validators in order:

**1. `validateSafeRelativePath`** -- rejects path traversal attacks

| Input | Result | Error |
|---|---|---|
| `../../../etc/passwd` | Rejected | `Resource path must not contain
path traversal (..)` |
| `/etc/passwd` | Rejected | `Resource path must be relative, not
absolute` |
| `file\0.txt` | Rejected | `Resource path contains null bytes` |
| `..\\..\\etc\\passwd` | Rejected | `Resource path must not contain
backslashes` |
| _(empty)_ | Rejected | `Resource path must not be empty` |

**2. `validateFilenameIntegrity`** -- enforces safe characters, length
limits, extension required

| Input | Result | Error |
|---|---|---|
| `my folder/file.mjs` | Rejected | `A path segment contains invalid
characters...` |
| `Makefile` | Rejected | `Filename must have an extension` |
| `aaa...(256 chars).mjs` | Rejected | `A path segment exceeds the
maximum length of 255 characters` |
| `a/b/.../file.mjs` (1025+ chars) | Rejected | `Resource path exceeds
maximum length of 1024 characters` |
| `src/handlers/index.mjs` | Accepted | -- |
| `my-app/my_file.tsx` | Accepted | -- |
| `v1.0/module.config.mjs` | Accepted | -- |

Allowed characters per segment: `a-z`, `A-Z`, `0-9`, `.`, `-`, `_`

**3. `validateResourceExtension`** -- checks extension against the
`FileFolder` allowlist

| Input | FileFolder | Result | Error |
|---|---|---|---|
| `handler.js` | `BuiltLogicFunction` | Rejected | `Invalid file
extension. Allowed extensions: .mjs` |
| `card.tsx` | `BuiltFrontComponent` | Rejected | `Invalid file
extension. Allowed extensions: .mjs` |
| `script.js` | `PublicAsset` | Rejected | `Invalid file extension.
Allowed extensions: .png, .jpg, ...` |
| `index.mjs` | `BuiltLogicFunction` | Accepted | -- |
| `app.tsx` | `Source` | Accepted | -- |
| `photo.png` | `CorePicture` | Accepted | -- (unconfigured folder,
passes through) |

## Consumers

- **`FileStorageService`** -- calls `validateResourcePath`, throws
`FileStorageException` on failure (last-resort defense)
- **Resolver (`uploadApplicationFile`)** -- calls
`validateResourcePath`, throws `ApplicationException` on failure
(user-facing)
- **Flat validators** -- call `validateResourcePath`, push the error to
`validationResult.errors` (non-throwing, collects all errors)

All error messages are translated via Lingui `t` and returned in a
discriminated union `{ isValid: true } | { isValid: false, error: string
}`, letting each consumer decide how to handle failures.
2026-05-25 11:52:54 +00:00
85d649e831 [Fix] Backfill missing command menu items conditional availability expression (#20852)
## Description

Following [report in
discord](https://discord.com/channels/1130383047699738754/1498690477044793386/1506602927412744242)

Some command menu items were showing to all users because they had no
conditional availability expression, whereas users did not actually have
access to the page or feature behind. For instance: "Go to Admin panel",
"Go to AI settings", "Send email" etc.

<img width="833" height="1245" alt="image"
src="https://github.com/user-attachments/assets/8d2a9404-9b81-4d58-9522-558e9924c457"
/>


## Fix

- Add conditional availability expressions
- Backfill expressions for existing workspaces as they are stored in db
(commandMenuItems table)

---------

Co-authored-by: Charles Bochet <[email protected]>
2026-05-23 13:22:25 +00:00
1175 changed files with 43394 additions and 13516 deletions
@@ -80,10 +80,20 @@ jobs:
with:
name: storybook-twenty-front-component-renderer
path: packages/twenty-front-component-renderer/storybook-static
- name: Resolve Playwright version
id: playwright-version
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"
- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.cache/ms-playwright
key: v4-playwright-browsers-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}
- name: Install Playwright
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: |
cd packages/twenty-front-component-renderer
npx playwright install
npx playwright install chromium
- name: Serve storybook & run tests
run: |
npx http-server packages/twenty-front-component-renderer/storybook-static --port 6008 --silent &
+11 -1
View File
@@ -96,10 +96,20 @@ jobs:
with:
name: storybook-static
path: packages/twenty-front/storybook-static
- name: Resolve Playwright version
id: playwright-version
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"
- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.cache/ms-playwright
key: v4-playwright-browsers-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}
- name: Install Playwright
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: |
cd packages/twenty-front
npx playwright install
npx playwright install chromium
- name: Front / Write .env
run: npx nx reset:env twenty-front
- name: Serve storybook & run tests
Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

+1 -1
View File
@@ -28,7 +28,7 @@
"resolutions": {
"graphql": "16.8.1",
"type-fest": "4.10.1",
"typescript": "5.9.2",
"typescript": "5.9.3",
"nodemailer": "8.0.4",
"graphql-redis-subscriptions/ioredis": "^5.6.0",
"@lingui/core": "5.1.2",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "create-twenty-app",
"version": "2.7.0",
"version": "2.9.0",
"description": "Command-line interface to create Twenty application",
"main": "dist/cli.cjs",
"bin": "dist/cli.cjs",
@@ -50,7 +50,7 @@
"jest": "29.7.0",
"jest-environment-node": "^29.4.1",
"twenty-shared": "workspace:*",
"typescript": "^5.9.2",
"typescript": "^5.9.3",
"vite": "^7.0.0",
"vite-plugin-dts": "^4.5.4",
"vite-tsconfig-paths": "^4.2.1"
@@ -80,8 +80,8 @@ export async function teardown() {
const uninstallResult = await appUninstall({ appPath: APP_PATH });
if (!uninstallResult.success) {
console.warn(
`App uninstall failed: ${uninstallResult.error?.message ?? 'Unknown error'}`,
throw new Error(
`App uninstall failed during teardown: ${JSON.stringify(uninstallResult.error, null, 2)}`,
);
}
}
@@ -0,0 +1,17 @@
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
@@ -1,6 +1,6 @@
{
"name": "twenty-partners",
"version": "0.1.0",
"version": "0.3.1",
"license": "MIT",
"engines": {
"node": "^24.5.0",
@@ -16,8 +16,13 @@
"test": "vitest run",
"test:watch": "vitest",
"seed": "tsx src/scripts/seed.ts",
"seed:prod": "ENV_FILE=.env.prod tsx src/scripts/seed.ts",
"purge": "tsx src/scripts/purge-soft-deleted.ts",
"purge:prod": "ENV_FILE=.env.prod tsx src/scripts/purge-soft-deleted.ts",
"import:dryrun": "tsx src/scripts/import-from-tft.ts",
"import:apply": "IMPORT_APPLY=1 tsx src/scripts/import-from-tft.ts"
"import:dryrun:prod": "ENV_FILE=.env.prod tsx src/scripts/import-from-tft.ts",
"import:apply": "IMPORT_APPLY=1 tsx src/scripts/import-from-tft.ts",
"import:apply:prod": "ENV_FILE=.env.prod IMPORT_APPLY=1 tsx src/scripts/import-from-tft.ts"
},
"dependencies": {
"twenty-client-sdk": "2.4.0",
@@ -3,7 +3,7 @@ export const APP_DESCRIPTION = '';
export const APPLICATION_UNIVERSAL_IDENTIFIER = 'e662fc1f-02c1-41ff-b8ba-c95a447b3965';
export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = 'ee18c3f3-ebe7-4c56-ad6d-aad555cc32db';
export const PARTNER_OBJECT_UNIVERSAL_IDENTIFIER = '39101b39-1c16-4148-9e82-45dc271bb90d';
export const PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER = '65172140-d377-41c1-a2ae-190e96fb79dd';
export const PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER = '65172140-d377-41c1-a2ae-190e96fb79dd';
export const ALL_PARTNERS_VIEW_UNIVERSAL_IDENTIFIER = '379b11d5-44d5-476b-ba7d-31d5f515c9b4';
export const ALL_MATCHED_DEALS_VIEW_UNIVERSAL_IDENTIFIER = '7a34da39-a8e1-44c7-88b4-91ceaa064920';
export const PARTNERS_NAV_UNIVERSAL_IDENTIFIER = '3fe15ab5-e38b-4914-af17-2270b210aeb2';
@@ -35,7 +35,7 @@ export const ALL_OPPORTUNITIES_NAV_UNIVERSAL_IDENTIFIER = '37944f52-cbe5-4814-a1
// Partner views + nav (harmonization)
export const PARTNER_APPLICATIONS_VIEW_UNIVERSAL_IDENTIFIER = 'b57a84ed-d7c1-420d-b0eb-348db0dac612';
export const VALIDATED_PARTNERS_VIEW_UNIVERSAL_IDENTIFIER = '13cca6a7-b9f1-4103-b011-ea2e39430899';
export const PARTNER_QUOTES_VIEW_UNIVERSAL_IDENTIFIER = 'd9db705c-795a-4a14-b891-6201149510b3';
export const PARTNER_CONTENT_VIEW_UNIVERSAL_IDENTIFIER = 'd9db705c-795a-4a14-b891-6201149510b3';
export const PARTNER_APPLICATIONS_NAV_UNIVERSAL_IDENTIFIER = '13e2334a-6b1e-4080-8c74-d11109990cc1';
export const VALIDATED_PARTNERS_NAV_UNIVERSAL_IDENTIFIER = '6aed30c6-d80f-4ac6-aab0-db5bc59e5c4b';
export const PARTNER_QUOTES_NAV_UNIVERSAL_IDENTIFIER = '3543723d-80c1-466a-ac35-86f7b284917b';
export const PARTNER_CONTENT_NAV_UNIVERSAL_IDENTIFIER = '3543723d-80c1-466a-ac35-86f7b284917b';
@@ -0,0 +1,22 @@
import { FieldType, OnDeleteAction, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export const PARTNER_CONTENT_CUSTOMER_COMPANY_FIELD_ID = 'd448f6be-533f-4c43-a70f-55dc361dcdd7';
export const PARTNER_CONTENTS_ON_COMPANY_FIELD_ID = '941e7707-1b3d-47d4-b13a-45c6628c1b3d';
export default defineField({
universalIdentifier: PARTNER_CONTENT_CUSTOMER_COMPANY_FIELD_ID,
objectUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'customerCompany',
label: 'Customer Company',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENTS_ON_COMPANY_FIELD_ID,
universalSettings: {
relationType: RelationType.MANY_TO_ONE,
onDelete: OnDeleteAction.SET_NULL,
joinColumnName: 'customerCompanyId',
},
});
@@ -0,0 +1,22 @@
import { FieldType, OnDeleteAction, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export const PARTNER_CONTENT_CUSTOMER_PERSON_FIELD_ID = 'f17547be-76aa-4231-bd1a-3f57bb1ae323';
export const PARTNER_CONTENTS_ON_PERSON_FIELD_ID = 'fae42f4e-b054-4267-a761-81a6792f7c12';
export default defineField({
universalIdentifier: PARTNER_CONTENT_CUSTOMER_PERSON_FIELD_ID,
objectUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'customerPerson',
label: 'Customer Person',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENTS_ON_PERSON_FIELD_ID,
universalSettings: {
relationType: RelationType.MANY_TO_ONE,
onDelete: OnDeleteAction.SET_NULL,
joinColumnName: 'customerPersonId',
},
});
@@ -0,0 +1,22 @@
import { FieldType, OnDeleteAction, RelationType, defineField } from 'twenty-sdk/define';
import { PARTNER_OBJECT_UNIVERSAL_IDENTIFIER, PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export const PARTNER_CONTENT_PARTNER_FIELD_ID = '1774738e-96a1-43e2-aca4-d3c7cc794c50';
export const PARTNER_CONTENTS_ON_PARTNER_FIELD_ID = 'ac7995f1-7ccf-4607-827b-0788eeacaee0';
export default defineField({
universalIdentifier: PARTNER_CONTENT_PARTNER_FIELD_ID,
objectUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'partner',
label: 'Partner',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENTS_ON_PARTNER_FIELD_ID,
universalSettings: {
relationType: RelationType.MANY_TO_ONE,
onDelete: OnDeleteAction.SET_NULL,
joinColumnName: 'partnerId',
},
});
@@ -0,0 +1,18 @@
import { FieldType, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_CONTENTS_ON_COMPANY_FIELD_ID, PARTNER_CONTENT_CUSTOMER_COMPANY_FIELD_ID } from './partner-content-customer-company.field';
export default defineField({
universalIdentifier: PARTNER_CONTENTS_ON_COMPANY_FIELD_ID,
objectUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier,
type: FieldType.RELATION,
name: 'partnerContents',
label: 'Partner Content',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENT_CUSTOMER_COMPANY_FIELD_ID,
universalSettings: {
relationType: RelationType.ONE_TO_MANY,
},
});
@@ -0,0 +1,18 @@
import { FieldType, RelationType, defineField } from 'twenty-sdk/define';
import { PARTNER_OBJECT_UNIVERSAL_IDENTIFIER, PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_CONTENTS_ON_PARTNER_FIELD_ID, PARTNER_CONTENT_PARTNER_FIELD_ID } from './partner-content-partner.field';
export default defineField({
universalIdentifier: PARTNER_CONTENTS_ON_PARTNER_FIELD_ID,
objectUniversalIdentifier: PARTNER_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'partnerContents',
label: 'Partner Content',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENT_PARTNER_FIELD_ID,
universalSettings: {
relationType: RelationType.ONE_TO_MANY,
},
});
@@ -0,0 +1,18 @@
import { FieldType, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_CONTENTS_ON_PERSON_FIELD_ID, PARTNER_CONTENT_CUSTOMER_PERSON_FIELD_ID } from './partner-content-customer-person.field';
export default defineField({
universalIdentifier: PARTNER_CONTENTS_ON_PERSON_FIELD_ID,
objectUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier,
type: FieldType.RELATION,
name: 'partnerContents',
label: 'Partner Content',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_CONTENT_CUSTOMER_PERSON_FIELD_ID,
universalSettings: {
relationType: RelationType.ONE_TO_MANY,
},
});
@@ -1,22 +0,0 @@
import { FieldType, OnDeleteAction, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export const PARTNER_QUOTE_OPPORTUNITY_FIELD_ID = '36684f3e-f01a-4270-8f34-78966747dd64';
export const PARTNER_QUOTES_ON_OPPORTUNITY_FIELD_ID = '4857f339-a051-4cdb-bd8a-6219b933d1ce';
export default defineField({
universalIdentifier: PARTNER_QUOTE_OPPORTUNITY_FIELD_ID,
objectUniversalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'opportunity',
label: 'Opportunity',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.opportunity.universalIdentifier,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_QUOTES_ON_OPPORTUNITY_FIELD_ID,
universalSettings: {
relationType: RelationType.MANY_TO_ONE,
onDelete: OnDeleteAction.SET_NULL,
joinColumnName: 'opportunityId',
},
});
@@ -1,22 +0,0 @@
import { FieldType, OnDeleteAction, RelationType, defineField } from 'twenty-sdk/define';
import { PARTNER_OBJECT_UNIVERSAL_IDENTIFIER, PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export const PARTNER_QUOTE_PARTNER_FIELD_ID = '1774738e-96a1-43e2-aca4-d3c7cc794c50';
export const PARTNER_QUOTES_ON_PARTNER_FIELD_ID = 'ac7995f1-7ccf-4607-827b-0788eeacaee0';
export default defineField({
universalIdentifier: PARTNER_QUOTE_PARTNER_FIELD_ID,
objectUniversalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'partner',
label: 'Partner',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_QUOTES_ON_PARTNER_FIELD_ID,
universalSettings: {
relationType: RelationType.MANY_TO_ONE,
onDelete: OnDeleteAction.SET_NULL,
joinColumnName: 'partnerId',
},
});
@@ -1,18 +0,0 @@
import { FieldType, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, defineField } from 'twenty-sdk/define';
import { PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_QUOTES_ON_OPPORTUNITY_FIELD_ID, PARTNER_QUOTE_OPPORTUNITY_FIELD_ID } from './partner-quote-opportunity.field';
export default defineField({
universalIdentifier: PARTNER_QUOTES_ON_OPPORTUNITY_FIELD_ID,
objectUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.opportunity.universalIdentifier,
type: FieldType.RELATION,
name: 'partnerQuotes',
label: 'Partner Quotes',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_QUOTE_OPPORTUNITY_FIELD_ID,
universalSettings: {
relationType: RelationType.ONE_TO_MANY,
},
});
@@ -1,18 +0,0 @@
import { FieldType, RelationType, defineField } from 'twenty-sdk/define';
import { PARTNER_OBJECT_UNIVERSAL_IDENTIFIER, PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_QUOTES_ON_PARTNER_FIELD_ID, PARTNER_QUOTE_PARTNER_FIELD_ID } from './partner-quote-partner.field';
export default defineField({
universalIdentifier: PARTNER_QUOTES_ON_PARTNER_FIELD_ID,
objectUniversalIdentifier: PARTNER_OBJECT_UNIVERSAL_IDENTIFIER,
type: FieldType.RELATION,
name: 'partnerQuotes',
label: 'Partner Quotes',
isNullable: true,
relationTargetObjectMetadataUniversalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
relationTargetFieldMetadataUniversalIdentifier: PARTNER_QUOTE_PARTNER_FIELD_ID,
universalSettings: {
relationType: RelationType.ONE_TO_MANY,
},
});
@@ -1,15 +1,15 @@
import { NavigationMenuItemType, defineNavigationMenuItem } from 'twenty-sdk/define';
import {
PARTNER_QUOTES_NAV_UNIVERSAL_IDENTIFIER,
PARTNER_QUOTES_VIEW_UNIVERSAL_IDENTIFIER,
PARTNER_CONTENT_NAV_UNIVERSAL_IDENTIFIER,
PARTNER_CONTENT_VIEW_UNIVERSAL_IDENTIFIER,
} from 'src/constants/universal-identifiers';
export default defineNavigationMenuItem({
universalIdentifier: PARTNER_QUOTES_NAV_UNIVERSAL_IDENTIFIER,
universalIdentifier: PARTNER_CONTENT_NAV_UNIVERSAL_IDENTIFIER,
type: NavigationMenuItemType.VIEW,
icon: 'IconFileDollar',
icon: 'IconQuote',
position: 3,
folderUniversalIdentifier: '857be3b5-82c6-45f7-b546-e20a8a97be8d',
viewUniversalIdentifier: PARTNER_QUOTES_VIEW_UNIVERSAL_IDENTIFIER,
viewUniversalIdentifier: PARTNER_CONTENT_VIEW_UNIVERSAL_IDENTIFIER,
});
@@ -1,15 +1,15 @@
import { FieldType, defineObject } from 'twenty-sdk/define';
import { PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
import { PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
export default defineObject({
universalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
nameSingular: 'partnerQuote',
namePlural: 'partnerQuotes',
labelSingular: 'Partner Quote',
labelPlural: 'Partner Quotes',
description: 'A quote a partner submitted for a customer deal',
icon: 'IconFileDollar',
universalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
nameSingular: 'partnerContent',
namePlural: 'partnerContents',
labelSingular: 'Partner Content',
labelPlural: 'Partner Content',
description: 'Marketing content involving a partner: quotes, case studies, logos',
icon: 'IconQuote',
isSearchable: true,
labelIdentifierFieldMetadataUniversalIdentifier: '9e688624-83d2-4715-8b18-80492a6de2b6',
fields: [
@@ -21,6 +21,20 @@ export default defineObject({
icon: 'IconTag',
defaultValue: "''",
},
{
universalIdentifier: '1d926e6e-6ac1-4d60-ab3d-a73114005692',
type: FieldType.MULTI_SELECT,
name: 'contentType',
label: 'Content Type',
icon: 'IconCategory',
isNullable: true,
options: [
{ id: '07f85e5b-0d70-416b-9884-256e469ed532', value: 'CUSTOMER_QUOTE', label: 'Customer quote', position: 0, color: 'blue' },
{ id: '108b2358-d04d-4fdc-83df-a5978d39f66f', value: 'CASE_STUDY', label: 'Case study', position: 1, color: 'green' },
{ id: 'eb45f371-f93c-4c45-9c8a-f29e1a58b7e4', value: 'PARTNER_QUOTE', label: 'Partner quote', position: 2, color: 'orange' },
{ id: '3356c8a0-41cd-47c3-a293-5862138abc1a', value: 'LOGO', label: 'Logo', position: 3, color: 'purple' },
],
},
{
universalIdentifier: 'a0fe09c4-c1f4-4b96-93c6-d7ec38f1166a',
type: FieldType.SELECT,
@@ -45,21 +59,21 @@ export default defineObject({
isNullable: true,
},
{
universalIdentifier: '2cbe67e3-24ec-421b-bab5-50f3306c2391',
type: FieldType.CURRENCY,
name: 'amount',
label: 'Amount',
icon: 'IconCoin',
universalIdentifier: 'da7e9094-e2c3-47d3-924f-a1d4d3c717ed',
type: FieldType.LINKS,
name: 'interview',
label: 'Interview',
icon: 'IconMicrophone',
isNullable: true,
},
{
universalIdentifier: 'f303369e-288c-4a48-9920-c1de0ad9a159',
type: FieldType.FILES,
name: 'quoteFile',
label: 'Quote File',
name: 'documents',
label: 'Documents',
icon: 'IconPaperclip',
isNullable: true,
universalSettings: { maxNumberOfValues: 1 },
universalSettings: { maxNumberOfValues: 10 },
},
],
});
@@ -23,7 +23,7 @@
// tsx src/scripts/import-from-tft.ts
import { config } from 'dotenv';
config({ path: '.env.local' });
config({ path: process.env.ENV_FILE ?? '.env.local' });
import { CoreApiClient } from 'twenty-client-sdk/core';
@@ -76,6 +76,17 @@ const PARTNER_STAGE_TO_VALIDATION: Record<string, string> = {
REJECTED: 'REJECTED',
};
// TFT person.partnerTimezone -> our Partner.region (MULTI_SELECT). TFT's value is a
// coarse timezone band, not a geography, so each maps to every region it plausibly
// covers. OTHER carries no signal -> no region. Region stays empty if unmapped.
const TIMEZONE_TO_REGION: Record<string, string[]> = {
AMERICAS: ['US', 'LATAM'],
EMEA: ['EUROPE', 'MENA', 'AFRICA'],
WEST_ASIA: ['MENA', 'APAC'],
EAST_ASIA_OCEANIA: ['APAC'],
OTHER: [],
};
// Local SELECT option sets, for preflight coverage checks (a TFT value not in
// these would fail a real write). Keep in sync with src/objects + src/fields.
const LOCAL_OPTIONS: Record<string, Set<string>> = {
@@ -101,6 +112,30 @@ const edges = (result: any, key: string): any[] =>
const uniq = (values: (string | undefined | null)[]): string[] =>
[...new Set(values.filter((v): v is string => !!v))];
// Normalize a domain for dedup. Twenty's company domain is a unique key but is
// stored with an https:// prefix, while TFT values vary, so compare on a canonical
// form (no protocol, no www, no trailing slash, lowercased).
const normDomain = (d?: string | null): string | undefined =>
d
? d.trim().toLowerCase().replace(/^https?:\/\//, '').replace(/^www\./, '').replace(/\/+$/, '') || undefined
: undefined;
// Distinct non-empty values across rows, for the preflight report. Flattens array
// fields (e.g. partnerScope, typeCustom) and stringifies, so scalar and
// multi-select fields share one path. Derived from the already-fetched source
// rows — no per-loop bookkeeping needed.
const distinct = <TRow>(rows: TRow[], pick: (row: TRow) => unknown): string[] =>
[
...new Set(
rows.flatMap((row) => {
const value = pick(row);
return Array.isArray(value) ? value : value != null ? [value] : [];
}),
),
]
.map(String)
.sort();
async function main() {
console.log(`[import] mode: ${APPLY ? 'APPLY (writing to local)' : 'DRY-RUN (no writes)'}`);
const local = new CoreApiClient({
@@ -114,26 +149,10 @@ async function main() {
if (APPLY && writes++ > 0) await new Promise((r) => setTimeout(r, 750));
};
// Distinct TFT values seen, for the preflight coverage report.
const seen: Record<string, Set<string>> = {
partnerStage: new Set(),
partnerTier: new Set(),
partnerScope: new Set(),
typeOfTeam: new Set(),
oppStage: new Set(),
hostingType: new Set(),
subscriptionType: new Set(),
subscriptionFrequency: new Set(),
quoteStatus: new Set(),
typeCustom: new Set(),
};
const note = (bucket: string, value?: string | null) => {
if (value) seen[bucket].add(value);
};
// ---------------------------------------------------------------------
// 1. Read all three TFT datasets (raw fetch; not rate-limited by local).
// ---------------------------------------------------------------------
console.log('[import] fetching TFT people...');
const tftPeople = edges(
await tftQuery(`query {
people(first: 500, filter: { partnerStage: { in: ["APPLICATION","POTENTIAL_PARTNER","PARTNER","FORMER_PARTNER","REJECTED"] } }) {
@@ -143,7 +162,7 @@ async function main() {
emails { primaryEmail }
city jobTitle
linkedinLink { primaryLinkUrl }
partnerStage partnerTier partnerScope partnerTypeOfTeam partnerIsAvailable partnerSkills
partnerStage partnerTier partnerScope partnerTypeOfTeam partnerTimezone partnerIsAvailable partnerSkills
partnerBudgetMinimum { amountMicros currencyCode }
partnerBudgetAverage { amountMicros currencyCode }
company { id name domainName { primaryLinkUrl } }
@@ -152,7 +171,8 @@ async function main() {
}`),
'people',
);
const tftOpps = edges(
console.log('[import] fetching TFT opportunities...');
const tftOppsAll = edges(
await tftQuery(`query {
opportunities(first: 500) {
edges { node {
@@ -166,16 +186,32 @@ async function main() {
}`),
'opportunities',
);
// Only import opportunities linked to a partner. The rest is TFT's general sales
// pipeline (mostly LOST/IDENTIFIED) — noise for a partners app. Every partner
// stage (INTRODUCED/WORKING) only ever appears on partner-linked opps anyway.
const tftOpps = tftOppsAll.filter((o: any) => o.partner?.id);
console.log(`[import] opportunities: ${tftOpps.length} partner-linked of ${tftOppsAll.length} total (skipping ${tftOppsAll.length - tftOpps.length} unlinked)`);
console.log('[import] fetching TFT partner content...');
const tftContent = edges(
await tftQuery(`query {
customerContents(first: 500) {
edges { node { id name status approvalDate typeCustom partnerPerson { id } } }
edges { node {
id name status approvalDate typeCustom
interview { primaryLinkUrl }
partnerPerson { id }
customerCompany { id name domainName { primaryLinkUrl } }
customerPerson { id }
} }
}
}`),
'customerContents',
);
const quotes = tftContent.filter((c: any) => Array.isArray(c.typeCustom) && c.typeCustom.includes('PARTNER_QUOTE'));
console.log(`[import] TFT: ${tftPeople.length} partner-people, ${tftOpps.length} opportunities, ${quotes.length} partner quotes`);
// Import all content TYPES (quotes, case studies, logos) but only records that
// involve a partner. Customer-only content (no partnerPerson) is noise for the
// partners app; a partner-linked case study/quote should show on the partner.
const contentRecords = tftContent.filter((c: any) => c.partnerPerson?.id);
console.log(`[import] TFT: ${tftPeople.length} partner-people, ${tftOpps.length} opportunities, ${tftContent.length} content records`);
console.log(`[import] partner content: ${contentRecords.length} partner-linked of ${tftContent.length} total (skipping ${tftContent.length - contentRecords.length} customer-only)`);
const personSlug = (p: any): string =>
slugify([p.name?.firstName, p.name?.lastName].filter(Boolean).join(' ').trim() || 'Unknown partner') || p.id;
@@ -183,6 +219,7 @@ async function main() {
// ---------------------------------------------------------------------
// 2. Batched existence lookups against local (one `in` query per object).
// ---------------------------------------------------------------------
console.log('[import] checking existing records in target workspace...');
const partnerSlugs = uniq(tftPeople.map(personSlug));
const partnerIdBySlug = new Map<string, string>(
partnerSlugs.length
@@ -195,17 +232,33 @@ async function main() {
: [],
);
const companyNames = uniq([...tftPeople.map((p: any) => p.company?.name), ...tftOpps.map((o: any) => o.company?.name)]);
const companyIdByName = new Map<string, string>(
companyNames.length
? edges(
await local.query({
companies: { __args: { filter: { name: { in: companyNames } }, first: 500 }, edges: { node: { id: true, name: true } } },
} as any),
'companies',
).map((n: any) => [n.name, n.id])
: [],
);
// Fetch existing companies and index by BOTH name and normalized domain. Twenty
// enforces uniqueness on domain, so dedup must be domain-aware: the same company
// can arrive under different names (e.g. "Acme" vs "acme.com") across TFT people,
// opps and content, and creating a second one collides on the domain constraint.
// Page through ALL companies (not just the first 500): these dedupe maps must
// be complete, or upsertCompany would create domain-colliding duplicates for
// companies that live beyond the first page in a larger workspace.
const existingCompanies: any[] = [];
let companiesCursor: string | undefined;
for (;;) {
const page: any = await local.query({
companies: {
__args: { filter: {}, first: 200, ...(companiesCursor ? { after: companiesCursor } : {}) },
edges: { node: { id: true, name: true, domainName: { primaryLinkUrl: true } } },
pageInfo: { hasNextPage: true, endCursor: true },
},
} as any);
existingCompanies.push(...edges(page, 'companies'));
if (!page?.companies?.pageInfo?.hasNextPage) break;
companiesCursor = page.companies.pageInfo.endCursor;
}
const companyIdByName = new Map<string, string>(existingCompanies.map((n: any) => [n.name, n.id]));
const companyIdByDomain = new Map<string, string>();
for (const c of existingCompanies) {
const nd = normDomain(c.domainName?.primaryLinkUrl);
if (nd && !companyIdByDomain.has(nd)) companyIdByDomain.set(nd, c.id);
}
const oppTftIds = uniq(tftOpps.filter((o: any) => o.name).map((o: any) => o.id));
const oppIdByTftId = new Map<string, string>(
@@ -219,14 +272,18 @@ async function main() {
: [],
);
const quoteNames = uniq(quotes.map((q: any) => q.name || 'Partner quote'));
const quoteIdByName = new Map<string, string>(
quoteNames.length
// Unnamed content upserts by name, so a constant fallback would make every
// unnamed record collide on one key (collapsing them on re-run). Key the
// fallback on the TFT id so each unnamed record stays distinct.
const contentName = (c: any): string => c.name || `Partner content ${c.id}`;
const contentNames = uniq(contentRecords.map(contentName));
const contentIdByName = new Map<string, string>(
contentNames.length
? edges(
await local.query({
partnerQuotes: { __args: { filter: { name: { in: quoteNames } }, first: 500 }, edges: { node: { id: true, name: true } } },
partnerContents: { __args: { filter: { name: { in: contentNames } }, first: 500 }, edges: { node: { id: true, name: true } } },
} as any),
'partnerQuotes',
'partnerContents',
).map((n: any) => [n.name, n.id])
: [],
);
@@ -238,43 +295,102 @@ async function main() {
const upsertCompany = async (name?: string, domain?: string): Promise<string | undefined> => {
if (!name) return undefined;
if (companyIdByName.has(name)) return companyIdByName.get(name);
const nd = normDomain(domain);
// Same company under a different name but same domain — reuse it.
if (nd && companyIdByDomain.has(nd)) {
const existingId = companyIdByDomain.get(nd) as string;
companyIdByName.set(name, existingId);
return existingId;
}
let id = `dry:company:${name}`;
if (APPLY) {
await pace();
const created: any = await local.mutation({
createCompany: {
__args: { data: { name, ...(domain ? { domainName: { primaryLinkUrl: domain } } : {}) } },
id: true,
},
} as any);
id = created.createCompany.id;
try {
const created: any = await local.mutation({
createCompany: {
__args: { data: { name, ...(domain ? { domainName: { primaryLinkUrl: domain } } : {}) } },
id: true,
},
} as any);
id = created.createCompany.id;
} catch (err) {
// Fallback: createCompany failed, almost certainly because the domain
// already exists (Twenty enforces a unique domain) on a company we
// didn't index. Re-find it and reuse instead of failing the import.
// `ilike` is a substring match — and the stored value carries an
// https:// prefix so we can't `eq` the normalized form — so it can
// return the wrong company ("acme.com" also matches "notacme.com" or
// "acme.com.br"). Confirm an exact normalized-domain match before reuse.
if (!nd) throw err;
await pace();
const candidates = edges(
await local.query({
companies: { __args: { filter: { domainName: { primaryLinkUrl: { ilike: `%${nd}%` } } }, first: 20 }, edges: { node: { id: true, domainName: { primaryLinkUrl: true } } } },
} as any),
'companies',
);
const match = candidates.find((c: any) => normDomain(c.domainName?.primaryLinkUrl) === nd);
if (!match?.id) throw err;
id = match.id;
console.log(`[import] company "${name}" reused existing by domain ${nd}`);
}
}
companyIdByName.set(name, id);
if (nd) companyIdByDomain.set(nd, id);
return id;
};
const budgetCurrency = (amount: any) =>
amount?.amountMicros != null ? { amountMicros: amount.amountMicros, currencyCode: amount.currencyCode ?? 'USD' } : undefined;
// Generic create/update dispatch shared by partners, opportunities and content.
// Owns pacing + APPLY-gating + the create-vs-update branch, so each loop below
// only builds its `data`. genql keys a mutation by the object name, so the
// create<Object>/update<Object> names are derived from one argument. Companies
// keep their own upsert (above) because of the domain-collision fallback.
// Returns the row id: the real id on APPLY, a synthetic dry id otherwise so the
// relation mapping in dry-run still resolves to a stable placeholder.
const upsert = async (
object: 'Partner' | 'Opportunity' | 'PartnerContent',
existingId: string | undefined,
data: Record<string, unknown>,
dryKey: string,
): Promise<string> => {
if (!APPLY) return existingId ?? `dry:${object}:${dryKey}`;
await pace();
if (existingId) {
await local.mutation({ [`update${object}`]: { __args: { id: existingId, data }, id: true } } as any);
return existingId;
}
const created: any = await local.mutation({ [`create${object}`]: { __args: { data }, id: true } } as any);
return created[`create${object}`].id;
};
// -- Partners (upsert by slug) --
console.log(`[import] upserting ${tftPeople.length} partners...`);
const localPartnerIdByTftPersonId = new Map<string, string>();
let partnersCreated = 0;
let partnersUpdated = 0;
let partnersDone = 0;
for (const p of tftPeople) {
note('partnerStage', p.partnerStage);
note('partnerTier', p.partnerTier);
(Array.isArray(p.partnerScope) ? p.partnerScope : []).forEach((s: string) => note('partnerScope', s));
note('typeOfTeam', p.partnerTypeOfTeam);
const slug = personSlug(p);
const companyId = await upsertCompany(p.company?.name, p.company?.domainName?.primaryLinkUrl);
// Timezone band -> geographic region(s). Unmapped/OTHER -> no region.
const region = TIMEZONE_TO_REGION[p.partnerTimezone] ?? [];
// A partner scoped for hosting is, by definition, a self-host expert.
const scope = Array.isArray(p.partnerScope) ? p.partnerScope : [];
const deploymentExpertise = scope.includes('HOSTING_ENVIRONMENT') ? ['SELF_HOST'] : [];
const data: Record<string, unknown> = {
name: [p.name?.firstName, p.name?.lastName].filter(Boolean).join(' ').trim() || 'Unknown partner',
slug,
validationStage: PARTNER_STAGE_TO_VALIDATION[p.partnerStage] ?? 'APPLICATION',
availability: p.partnerIsAvailable ? 'AVAILABLE' : 'UNAVAILABLE',
// TFT has no language data; default everyone to English.
languagesSpoken: ['ENGLISH'],
...(p.partnerTier ? { partnerTier: p.partnerTier } : {}),
...(Array.isArray(p.partnerScope) && p.partnerScope.length ? { partnerScope: p.partnerScope } : {}),
...(scope.length ? { partnerScope: scope } : {}),
...(region.length ? { region } : {}),
...(deploymentExpertise.length ? { deploymentExpertise } : {}),
...(p.partnerTypeOfTeam ? { typeOfTeam: p.partnerTypeOfTeam } : {}),
...(Array.isArray(p.partnerSkills) && p.partnerSkills.length ? { skills: p.partnerSkills } : {}),
...(p.city ? { city: p.city } : {}),
@@ -284,39 +400,29 @@ async function main() {
...(companyId && APPLY ? { companyId } : {}),
};
let partnerId = partnerIdBySlug.get(slug);
if (partnerId) {
if (APPLY) {
await pace();
await local.mutation({ updatePartner: { __args: { id: partnerId, data }, id: true } } as any);
}
const existingId = partnerIdBySlug.get(slug);
const partnerId = await upsert('Partner', existingId, data, slug);
if (existingId) {
partnersUpdated++;
} else {
if (APPLY) {
await pace();
const created: any = await local.mutation({ createPartner: { __args: { data }, id: true } } as any);
partnerId = created.createPartner.id;
} else {
partnerId = `dry:partner:${slug}`;
}
partnerIdBySlug.set(slug, partnerId as string);
partnerIdBySlug.set(slug, partnerId);
partnersCreated++;
}
localPartnerIdByTftPersonId.set(p.id, partnerId as string);
localPartnerIdByTftPersonId.set(p.id, partnerId);
partnersDone++;
if (partnersDone % 10 === 0 || partnersDone === tftPeople.length)
console.log(`[import] partners ${partnersDone}/${tftPeople.length} (created=${partnersCreated} updated=${partnersUpdated})`);
}
console.log(`[import] partners created=${partnersCreated} updated=${partnersUpdated}`);
console.log(`[import] partners done: created=${partnersCreated} updated=${partnersUpdated}`);
// -- Opportunities (upsert by tftOpportunityId) --
console.log(`[import] upserting ${tftOpps.length} opportunities...`);
let oppsCreated = 0;
let oppsUpdated = 0;
let oppsPartnerLinked = 0;
let oppsDone = 0;
for (const o of tftOpps) {
if (!o.name) continue;
note('oppStage', o.stage);
note('hostingType', o.hostingType);
note('subscriptionType', o.subscriptionType);
note('subscriptionFrequency', o.subscriptionFrequence);
const companyId = await upsertCompany(o.company?.name, o.company?.domainName?.primaryLinkUrl);
const partnerId = o.partner?.id ? localPartnerIdByTftPersonId.get(o.partner.id) : undefined;
if (partnerId) oppsPartnerLinked++;
@@ -338,58 +444,44 @@ async function main() {
};
const existingId = oppIdByTftId.get(o.id);
if (existingId) {
if (APPLY) {
await pace();
await local.mutation({ updateOpportunity: { __args: { id: existingId, data }, id: true } } as any);
}
oppsUpdated++;
} else {
if (APPLY) {
await pace();
await local.mutation({ createOpportunity: { __args: { data }, id: true } } as any);
}
oppsCreated++;
}
await upsert('Opportunity', existingId, data, o.id);
if (existingId) oppsUpdated++;
else oppsCreated++;
oppsDone++;
if (oppsDone % 20 === 0 || oppsDone === tftOpps.length)
console.log(`[import] opportunities ${oppsDone}/${tftOpps.length} (created=${oppsCreated} updated=${oppsUpdated})`);
}
console.log(`[import] opportunities created=${oppsCreated} updated=${oppsUpdated} (partner-linked=${oppsPartnerLinked})`);
console.log(`[import] opportunities done: created=${oppsCreated} updated=${oppsUpdated} (partner-linked=${oppsPartnerLinked})`);
// -- Partner quotes (upsert by name) --
let quotesCreated = 0;
let quotesUpdated = 0;
tftContent.forEach((c: any) => (Array.isArray(c.typeCustom) ? c.typeCustom : []).forEach((t: string) => note('typeCustom', t)));
for (const q of quotes) {
note('quoteStatus', q.status);
const name = q.name || 'Partner quote';
const partnerId = q.partnerPerson?.id ? localPartnerIdByTftPersonId.get(q.partnerPerson.id) : undefined;
// -- Partner content (upsert by name) --
console.log(`[import] upserting ${contentRecords.length} content records...`);
let contentCreated = 0;
let contentUpdated = 0;
for (const c of contentRecords) {
const name = contentName(c);
const partnerId = c.partnerPerson?.id ? localPartnerIdByTftPersonId.get(c.partnerPerson.id) : undefined;
const customerCompanyId = await upsertCompany(c.customerCompany?.name, c.customerCompany?.domainName?.primaryLinkUrl);
const data: Record<string, unknown> = {
name,
...(q.status ? { status: q.status } : {}),
...(q.approvalDate ? { approvalDate: q.approvalDate } : {}),
...(Array.isArray(c.typeCustom) && c.typeCustom.length ? { contentType: c.typeCustom } : {}),
...(c.status ? { status: c.status } : {}),
...(c.approvalDate ? { approvalDate: c.approvalDate } : {}),
...(c.interview?.primaryLinkUrl ? { interview: { primaryLinkUrl: c.interview.primaryLinkUrl } } : {}),
...(partnerId && APPLY ? { partnerId } : {}),
...(customerCompanyId && APPLY ? { customerCompanyId } : {}),
};
const existingId = quoteIdByName.get(name);
if (existingId) {
if (APPLY) {
await pace();
await local.mutation({ updatePartnerQuote: { __args: { id: existingId, data }, id: true } } as any);
}
quotesUpdated++;
} else {
if (APPLY) {
await pace();
await local.mutation({ createPartnerQuote: { __args: { data }, id: true } } as any);
}
quotesCreated++;
}
const existingId = contentIdByName.get(name);
await upsert('PartnerContent', existingId, data, name);
if (existingId) contentUpdated++;
else contentCreated++;
}
console.log(`[import] partner quotes created=${quotesCreated} updated=${quotesUpdated}`);
console.log(`[import] partner content created=${contentCreated} updated=${contentUpdated}`);
// ---------------------------------------------------------------------
// 4. Preflight: distinct TFT values vs local option coverage.
// 4. Preflight: distinct TFT values vs local option coverage. Derived
// directly from the fetched source rows (no per-loop bookkeeping).
// ---------------------------------------------------------------------
const report = (label: string, bucket: string, optionKey?: string) => {
const values = [...seen[bucket]].sort();
const report = (label: string, values: string[], optionKey?: string) => {
const allowed = optionKey ? LOCAL_OPTIONS[optionKey] : undefined;
const uncovered = allowed ? values.filter((v) => !allowed.has(v)) : [];
console.log(
@@ -397,21 +489,27 @@ async function main() {
(uncovered.length ? ` ⚠️ NOT IN LOCAL OPTIONS: ${uncovered.join(', ')}` : ''),
);
};
const partnerStages = distinct(tftPeople, (p: any) => p.partnerStage);
const oppStages = distinct(tftOpps, (o: any) => o.stage);
const timezones = distinct(tftPeople, (p: any) => p.partnerTimezone);
console.log('--- preflight: distinct TFT values seen ---');
report('partnerStage (-> validationStage map)', 'partnerStage');
report('partnerTier', 'partnerTier', 'partnerTier');
report('partnerScope', 'partnerScope', 'partnerScope');
report('typeOfTeam', 'typeOfTeam', 'typeOfTeam');
report('opp stage (-> matchStatus map)', 'oppStage');
report('hostingType', 'hostingType', 'hostingType');
report('subscriptionType', 'subscriptionType', 'subscriptionType');
report('subscriptionFrequency', 'subscriptionFrequency', 'subscriptionFrequency');
report('quote status', 'quoteStatus', 'quoteStatus');
report('customerContent typeCustom', 'typeCustom');
const unmappedStages = [...seen.partnerStage].filter((s) => !(s in PARTNER_STAGE_TO_VALIDATION));
const unmappedOpps = [...seen.oppStage].filter((s) => !(s in STAGE_TO_MATCH_STATUS));
report('partnerStage (-> validationStage map)', partnerStages);
report('partnerTier', distinct(tftPeople, (p: any) => p.partnerTier), 'partnerTier');
report('partnerScope', distinct(tftPeople, (p: any) => p.partnerScope), 'partnerScope');
report('typeOfTeam', distinct(tftPeople, (p: any) => p.partnerTypeOfTeam), 'typeOfTeam');
report('partnerTimezone (-> region map)', timezones);
report('opp stage (-> matchStatus map)', oppStages);
report('hostingType', distinct(tftOpps, (o: any) => o.hostingType), 'hostingType');
report('subscriptionType', distinct(tftOpps, (o: any) => o.subscriptionType), 'subscriptionType');
report('subscriptionFrequency', distinct(tftOpps, (o: any) => o.subscriptionFrequence), 'subscriptionFrequency');
report('quote status', distinct(contentRecords, (c: any) => c.status), 'quoteStatus');
report('customerContent typeCustom', distinct(contentRecords, (c: any) => c.typeCustom));
const unmappedStages = partnerStages.filter((s) => !(s in PARTNER_STAGE_TO_VALIDATION));
const unmappedOpps = oppStages.filter((s) => !(s in STAGE_TO_MATCH_STATUS));
const unmappedTz = timezones.filter((t) => !(t in TIMEZONE_TO_REGION));
if (unmappedStages.length) console.log(`[preflight] ⚠️ partnerStage not mapped: ${unmappedStages.join(', ')}`);
if (unmappedOpps.length) console.log(`[preflight] ⚠️ opp stage not mapped: ${unmappedOpps.join(', ')}`);
if (unmappedTz.length) console.log(`[preflight] ⚠️ partnerTimezone not mapped: ${unmappedTz.join(', ')}`);
}
main().catch((err) => {
@@ -0,0 +1,59 @@
// Hard-destroy soft-deleted records that block re-imports.
//
// Twenty SOFT-deletes (sets deletedAt); the row stays in the DB and keeps holding
// unique constraints (e.g. company domain, partner slug). But normal queries —
// including the import's existence checks — exclude soft-deleted rows. So after a
// UI "delete" or a partial import that got rolled back, re-running the import hits
// "A duplicate entry was detected" on records it cannot see. This purges those
// ghosts permanently so idempotent upserts work again.
//
// Only touches soft-deleted rows (deletedAt IS NOT NULL); active/default data is
// left untouched. One bulk destroy per object, so it is not rate-limited.
//
// yarn purge # against .env.local
// yarn purge:prod # against .env.prod
//
import { config } from 'dotenv';
config({ path: process.env.ENV_FILE ?? '.env.local' });
const requireEnv = (name: string): string => {
const value = process.env[name];
if (!value) throw new Error(`Missing ${name} env var`);
return value;
};
// Objects the import writes to. partners + partnerContents are app custom objects;
// companies + opportunities are standard but populated by the import.
const OBJECTS = ['companies', 'partners', 'opportunities', 'partnerContents'] as const;
const gql = async (url: string, key: string, query: string): Promise<any> => {
const response = await fetch(`${url.replace(/\/$/, '')}/graphql`, {
method: 'POST',
headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ query }),
});
const json: any = await response.json();
if (json.errors?.length) throw new Error(JSON.stringify(json.errors));
return json.data;
};
async function main() {
const url = requireEnv('TWENTY_PARTNERS_API_URL');
const key = requireEnv('TWENTY_PARTNERS_API_KEY');
console.log(`[purge] target: ${url} — destroying soft-deleted rows only`);
for (const obj of OBJECTS) {
// destroy<Object>s is the bulk variant; capitalise + already-plural names.
const mutationName = `destroy${obj.charAt(0).toUpperCase()}${obj.slice(1)}`;
const data = await gql(url, key, `mutation { ${mutationName}(filter: { deletedAt: { is: NOT_NULL } }) { id } }`);
const destroyed = data[mutationName]?.length ?? 0;
console.log(`[purge] ${obj}: destroyed ${destroyed} soft-deleted`);
}
console.log('[purge] done');
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
@@ -11,7 +11,7 @@
// tsx src/scripts/seed.ts
import { config } from 'dotenv';
config({ path: '.env.local' });
config({ path: process.env.ENV_FILE ?? '.env.local' });
import { CoreApiClient } from 'twenty-client-sdk/core';
@@ -89,13 +89,13 @@ const OPPORTUNITIES: Opp[] = [
{ name: 'Sunrise — vendor onboarding', companyName: 'Sunrise Logistics', matchStatus: 'LOST', numberOfSeats: 10, hostingType: 'CLOUD', subscriptionType: 'PRO', subscriptionFrequency: 'MONTHLY' },
];
type Quote = { name: string; status: string; partnerSlug: string; oppName: string };
type Quote = { name: string; status: string; partnerSlug: string; contentType: string[] };
const QUOTES: Quote[] = [
{ name: 'Sunrise APAC fleet — Nine Dots quote', status: 'WIP', partnerSlug: 'nine-dots-ventures', oppName: 'Sunrise — APAC fleet CRM' },
{ name: 'Helix clinical — NetZero quote', status: 'INTERVIEW_SCHEDULED', partnerSlug: 'netzero-systems', oppName: 'Helix Bio — clinical trials CRM' },
{ name: 'Acme rollout — Elevate quote', status: 'UNDER_CUSTOMER_PARTNER_REVIEW', partnerSlug: 'elevate-consulting', oppName: 'Acme RE — CRM rollout' },
{ name: 'Sunrise LATAM — Nine Dots quote', status: 'APPROVED', partnerSlug: 'nine-dots-ventures', oppName: 'Sunrise — LATAM expansion' },
{ name: 'Helix self-host — Meridian quote', status: 'REJECTED', partnerSlug: 'meridian-craft', oppName: 'Helix Bio — self-host evaluation' },
{ name: 'Sunrise APAC fleet — Nine Dots quote', status: 'WIP', partnerSlug: 'nine-dots-ventures', contentType: ['PARTNER_QUOTE'] },
{ name: 'Helix clinical — NetZero quote', status: 'INTERVIEW_SCHEDULED', partnerSlug: 'netzero-systems', contentType: ['PARTNER_QUOTE'] },
{ name: 'Acme rollout — Elevate quote', status: 'UNDER_CUSTOMER_PARTNER_REVIEW', partnerSlug: 'elevate-consulting', contentType: ['PARTNER_QUOTE'] },
{ name: 'Sunrise LATAM — Nine Dots quote', status: 'APPROVED', partnerSlug: 'nine-dots-ventures', contentType: ['PARTNER_QUOTE'] },
{ name: 'Helix self-host — Meridian quote', status: 'REJECTED', partnerSlug: 'meridian-craft', contentType: ['CASE_STUDY'] },
];
const nodes = (r: any, key: string): any[] => (r?.[key]?.edges ?? []).map((e: any) => e.node);
@@ -177,12 +177,12 @@ async function main() {
// -- Partner quotes (upsert by name) --
let quoteCount = 0;
for (const q of QUOTES) {
const data = { name: q.name, status: q.status, partnerId: partnerIdBySlug.get(q.partnerSlug), opportunityId: oppIdByName.get(q.oppName) };
const existing = nodes(await client.query({ partnerQuotes: { __args: { filter: { name: { eq: q.name } }, first: 1 }, edges: { node: { id: true } } } } as any), 'partnerQuotes');
const data = { name: q.name, status: q.status, contentType: q.contentType, partnerId: partnerIdBySlug.get(q.partnerSlug) };
const existing = nodes(await client.query({ partnerContents: { __args: { filter: { name: { eq: q.name } }, first: 1 }, edges: { node: { id: true } } } } as any), 'partnerContents');
if (existing[0]?.id) {
await client.mutation({ updatePartnerQuote: { __args: { id: existing[0].id, data }, id: true } } as any);
await client.mutation({ updatePartnerContent: { __args: { id: existing[0].id, data }, id: true } } as any);
} else {
await client.mutation({ createPartnerQuote: { __args: { data }, id: true } } as any);
await client.mutation({ createPartnerContent: { __args: { data }, id: true } } as any);
}
quoteCount++;
}
@@ -1,21 +1,21 @@
import { ViewType, defineView } from 'twenty-sdk/define';
import {
PARTNER_QUOTES_VIEW_UNIVERSAL_IDENTIFIER,
PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
PARTNER_CONTENT_VIEW_UNIVERSAL_IDENTIFIER,
PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
} from 'src/constants/universal-identifiers';
// Index view for partner quotes.
// Index view for partner content.
export default defineView({
universalIdentifier: PARTNER_QUOTES_VIEW_UNIVERSAL_IDENTIFIER,
name: 'Partner quotes',
icon: 'IconFileDollar',
objectUniversalIdentifier: PARTNER_QUOTE_OBJECT_UNIVERSAL_IDENTIFIER,
universalIdentifier: PARTNER_CONTENT_VIEW_UNIVERSAL_IDENTIFIER,
name: 'Partner content',
icon: 'IconQuote',
objectUniversalIdentifier: PARTNER_CONTENT_OBJECT_UNIVERSAL_IDENTIFIER,
type: ViewType.TABLE,
fields: [
{ universalIdentifier: 'ad7b3702-b552-4355-afec-1e1e96d9f3df', fieldMetadataUniversalIdentifier: '9e688624-83d2-4715-8b18-80492a6de2b6', position: 0, isVisible: true },
{ universalIdentifier: '426e0c2d-449d-4a06-860b-0cfe0ed501e6', fieldMetadataUniversalIdentifier: 'a0fe09c4-c1f4-4b96-93c6-d7ec38f1166a', position: 1, isVisible: true },
{ universalIdentifier: '62bb1536-539c-4fb0-95bf-440c5c5da89f', fieldMetadataUniversalIdentifier: '2cbe67e3-24ec-421b-bab5-50f3306c2391', position: 2, isVisible: true },
{ universalIdentifier: 'a9bf3eaa-ec27-4a0a-8df2-e18c8f4239a7', fieldMetadataUniversalIdentifier: '1d926e6e-6ac1-4d60-ab3d-a73114005692', position: 1, isVisible: true },
{ universalIdentifier: '426e0c2d-449d-4a06-860b-0cfe0ed501e6', fieldMetadataUniversalIdentifier: 'a0fe09c4-c1f4-4b96-93c6-d7ec38f1166a', position: 2, isVisible: true },
{ universalIdentifier: 'fbd1f953-1dd2-4d0f-a239-148a0688fbff', fieldMetadataUniversalIdentifier: 'b52d263e-423e-40b0-b82c-29214597c005', position: 3, isVisible: true },
],
});
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "twenty-client-sdk",
"version": "2.7.0",
"version": "2.9.0",
"sideEffects": false,
"license": "AGPL-3.0",
"scripts": {
@@ -42,14 +42,14 @@
"dependencies": {
"@genql/cli": "^3.0.3",
"@genql/runtime": "^2.10.0",
"esbuild": "^0.25.0",
"esbuild": "^0.28.0",
"graphql": "^16.8.1"
},
"devDependencies": {
"@typescript/native-preview": "^7.0.0-dev.20260116.1",
"tsc-alias": "^1.8.16",
"twenty-shared": "workspace:*",
"typescript": "^5.9.2",
"typescript": "^5.9.3",
"vite": "^7.0.0",
"vite-plugin-dts": "^4.5.4",
"vite-tsconfig-paths": "^4.2.1",
@@ -247,7 +247,7 @@ type FieldPermission {
type RolePermissionFlag {
id: UUID!
roleId: UUID!
flag: PermissionFlagType!
flag: String!
}
type ApiKeyForRole {
@@ -523,6 +523,7 @@ type IndexField {
id: UUID!
fieldMetadataId: UUID!
order: Float!
subFieldName: String
createdAt: DateTime!
updatedAt: DateTime!
}
@@ -1099,7 +1100,7 @@ type PageLayoutWidgetCanvasPosition {
layoutMode: PageLayoutTabLayoutMode!
}
union WidgetConfiguration = AggregateChartConfiguration | StandaloneRichTextConfiguration | PieChartConfiguration | LineChartConfiguration | IframeConfiguration | GaugeChartConfiguration | BarChartConfiguration | CalendarConfiguration | FrontComponentConfiguration | EmailsConfiguration | EmailThreadConfiguration | FieldConfiguration | FieldRichTextConfiguration | FieldsConfiguration | FilesConfiguration | NotesConfiguration | TasksConfiguration | TimelineConfiguration | ViewConfiguration | RecordTableConfiguration | WorkflowConfiguration | WorkflowRunConfiguration | WorkflowVersionConfiguration
union WidgetConfiguration = AggregateChartConfiguration | StandaloneRichTextConfiguration | PieChartConfiguration | LineChartConfiguration | IframeConfiguration | BarChartConfiguration | CalendarConfiguration | FrontComponentConfiguration | EmailsConfiguration | EmailThreadConfiguration | FieldConfiguration | FieldRichTextConfiguration | FieldsConfiguration | FilesConfiguration | NotesConfiguration | TasksConfiguration | TimelineConfiguration | ViewConfiguration | RecordTableConfiguration | WorkflowConfiguration | WorkflowRunConfiguration | WorkflowVersionConfiguration
type AggregateChartConfiguration {
configurationType: WidgetConfigurationType!
@@ -1119,7 +1120,6 @@ type AggregateChartConfiguration {
enum WidgetConfigurationType {
AGGREGATE_CHART
GAUGE_CHART
PIE_CHART
BAR_CHART
LINE_CHART
@@ -1238,18 +1238,6 @@ type IframeConfiguration {
url: String
}
type GaugeChartConfiguration {
configurationType: WidgetConfigurationType!
aggregateFieldMetadataId: UUID!
aggregateOperation: AggregateOperations!
displayDataLabel: Boolean
color: String
description: String
filter: JSON
timezone: String
firstDayOfTheWeek: Int
}
type BarChartConfiguration {
configurationType: WidgetConfigurationType!
aggregateFieldMetadataId: UUID!
@@ -1314,6 +1302,7 @@ type FieldConfiguration {
configurationType: WidgetConfigurationType!
fieldMetadataId: String!
fieldDisplayMode: FieldDisplayMode!
viewId: String
}
"""Display mode for field configuration widgets"""
@@ -1322,6 +1311,7 @@ enum FieldDisplayMode {
EDITOR
FIELD
VIEW
TABLE
}
type FieldRichTextConfiguration {
@@ -1443,6 +1433,39 @@ type Analytics {
success: Boolean!
}
type VerificationRecord {
type: String!
key: String!
value: String!
priority: Float
}
type EmailingDomain {
id: UUID!
createdAt: DateTime!
updatedAt: DateTime!
domain: String!
driver: EmailingDomainDriver!
status: EmailingDomainStatus!
verificationRecords: [VerificationRecord!]
verifiedAt: DateTime
}
enum EmailingDomainDriver {
AWS_SES
}
enum EmailingDomainStatus {
PENDING
VERIFIED
FAILED
TEMPORARY_FAILURE
}
type SendEmailViaDomainOutput {
messageId: String!
}
type ApprovedAccessDomain {
id: UUID!
domain: String!
@@ -1753,7 +1776,6 @@ enum FeatureFlagKey {
IS_JSON_FILTER_ENABLED
IS_MARKETPLACE_SETTING_TAB_VISIBLE
IS_PUBLIC_DOMAIN_ENABLED
IS_EMAILING_DOMAIN_ENABLED
IS_EMAIL_GROUP_ENABLED
IS_JUNCTION_RELATIONS_ENABLED
IS_REST_METADATA_API_NEW_FORMAT_DIRECT
@@ -2370,35 +2392,6 @@ type PublicDomain {
createdAt: DateTime!
}
type VerificationRecord {
type: String!
key: String!
value: String!
priority: Float
}
type EmailingDomain {
id: UUID!
createdAt: DateTime!
updatedAt: DateTime!
domain: String!
driver: EmailingDomainDriver!
status: EmailingDomainStatus!
verificationRecords: [VerificationRecord!]
verifiedAt: DateTime
}
enum EmailingDomainDriver {
AWS_SES
}
enum EmailingDomainStatus {
PENDING
VERIFIED
FAILED
TEMPORARY_FAILURE
}
type AutocompleteResult {
text: String!
placeId: String!
@@ -2943,6 +2936,7 @@ type Query {
getPageLayoutTab(id: String!): PageLayoutTab!
getPageLayouts(objectMetadataId: String, pageLayoutType: PageLayoutType): [PageLayout!]!
getPageLayout(id: String!): PageLayout
getEmailingDomains: [EmailingDomain!]!
applicationConnectionProviders(applicationId: UUID!): [ApplicationConnectionProvider!]!
getPageLayoutWidgets(pageLayoutTabId: String!): [PageLayoutWidget!]!
getPageLayoutWidget(id: String!): PageLayoutWidget!
@@ -3037,7 +3031,6 @@ type Query {
getAddressDetails(placeId: String!, token: String!): PlaceDetailsResult!
getUsageAnalytics(input: UsageAnalyticsInput): UsageAnalytics!
findManyPublicDomains: [PublicDomain!]!
getEmailingDomains: [EmailingDomain!]!
findManyMarketplaceApps: [MarketplaceApp!]!
findMarketplaceAppDetail(universalIdentifier: String!): MarketplaceAppDetail!
}
@@ -3192,6 +3185,10 @@ type Mutation {
resetPageLayoutToDefault(id: String!): PageLayout!
resetPageLayoutWidgetToDefault(id: String!): PageLayoutWidget!
resetPageLayoutTabToDefault(id: String!): PageLayoutTab!
createEmailingDomain(domain: String!, driver: EmailingDomainDriver!): EmailingDomain!
deleteEmailingDomain(id: String!): Boolean!
verifyEmailingDomain(id: String!): EmailingDomain!
sendEmailViaEmailingDomain(input: SendEmailViaDomainInput!): SendEmailViaDomainOutput!
updateOneApplicationVariable(key: String!, value: String!, applicationId: UUID!): Boolean!
createPageLayoutWidget(input: CreatePageLayoutWidgetInput!): PageLayoutWidget!
updatePageLayoutWidget(id: String!, input: UpdatePageLayoutWidgetInput!): PageLayoutWidget!
@@ -3209,6 +3206,8 @@ type Mutation {
createOneObject(input: CreateOneObjectInput!): Object!
deleteOneObject(input: DeleteOneObjectInput!): Object!
updateOneObject(input: UpdateOneObjectInput!): Object!
createOneIndex(input: CreateOneIndexInput!): Index!
deleteOneIndex(input: DeleteOneIndexInput!): Index!
createOneAgent(input: CreateAgentInput!): Agent!
updateOneAgent(input: UpdateAgentInput!): Agent!
deleteOneAgent(input: AgentIdInput!): Agent!
@@ -3310,9 +3309,6 @@ type Mutation {
updatePublicDomain(domain: String!, applicationId: String): PublicDomain!
deletePublicDomain(domain: String!): Boolean!
checkPublicDomainValidRecords(domain: String!): DomainValidRecords
createEmailingDomain(domain: String!, driver: EmailingDomainDriver!): EmailingDomain!
deleteEmailingDomain(id: String!): Boolean!
verifyEmailingDomain(id: String!): EmailingDomain!
createOneAppToken(input: CreateOneAppTokenInput!): AppToken!
installMarketplaceApp(universalIdentifier: String!, version: String): Boolean! @deprecated(reason: "Use installApplication instead")
installApplication(universalIdentifier: String!, version: String): Application!
@@ -3756,6 +3752,18 @@ input GridPositionInput {
columnSpan: Float!
}
input SendEmailViaDomainInput {
emailingDomainId: String!
to: [String!]!
cc: [String!]
bcc: [String!]
subject: String!
text: String!
html: String
from: String!
replyTo: [String!]
}
input CreatePageLayoutWidgetInput {
pageLayoutTabId: UUID!
title: String!
@@ -3925,6 +3933,27 @@ input UpdateObjectPayload {
isSearchable: Boolean
}
input CreateOneIndexInput {
"""The custom index to create"""
index: CreateIndexInput!
}
input CreateIndexInput {
objectMetadataId: UUID!
fields: [CreateIndexFieldInput!]!
indexType: IndexType! = BTREE
}
input CreateIndexFieldInput {
fieldMetadataId: UUID!
subFieldName: String
}
input DeleteOneIndexInput {
"""The id of the custom index to delete."""
id: UUID!
}
input CreateAgentInput {
name: String
label: String!
@@ -4005,7 +4034,7 @@ input ObjectPermissionInput {
input UpsertPermissionFlagsInput {
roleId: UUID!
permissionFlagKeys: [PermissionFlagType!]!
permissionFlagKeys: [String!]!
}
input UpsertFieldPermissionsInput {
@@ -193,7 +193,7 @@ export interface FieldPermission {
export interface RolePermissionFlag {
id: Scalars['UUID']
roleId: Scalars['UUID']
flag: PermissionFlagType
flag: Scalars['String']
__typename: 'RolePermissionFlag'
}
@@ -386,6 +386,7 @@ export interface IndexField {
id: Scalars['UUID']
fieldMetadataId: Scalars['UUID']
order: Scalars['Float']
subFieldName?: Scalars['String']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
__typename: 'IndexField'
@@ -789,7 +790,7 @@ export interface PageLayoutWidgetCanvasPosition {
__typename: 'PageLayoutWidgetCanvasPosition'
}
export type WidgetConfiguration = (AggregateChartConfiguration | StandaloneRichTextConfiguration | PieChartConfiguration | LineChartConfiguration | IframeConfiguration | GaugeChartConfiguration | BarChartConfiguration | CalendarConfiguration | FrontComponentConfiguration | EmailsConfiguration | EmailThreadConfiguration | FieldConfiguration | FieldRichTextConfiguration | FieldsConfiguration | FilesConfiguration | NotesConfiguration | TasksConfiguration | TimelineConfiguration | ViewConfiguration | RecordTableConfiguration | WorkflowConfiguration | WorkflowRunConfiguration | WorkflowVersionConfiguration) & { __isUnion?: true }
export type WidgetConfiguration = (AggregateChartConfiguration | StandaloneRichTextConfiguration | PieChartConfiguration | LineChartConfiguration | IframeConfiguration | BarChartConfiguration | CalendarConfiguration | FrontComponentConfiguration | EmailsConfiguration | EmailThreadConfiguration | FieldConfiguration | FieldRichTextConfiguration | FieldsConfiguration | FilesConfiguration | NotesConfiguration | TasksConfiguration | TimelineConfiguration | ViewConfiguration | RecordTableConfiguration | WorkflowConfiguration | WorkflowRunConfiguration | WorkflowVersionConfiguration) & { __isUnion?: true }
export interface AggregateChartConfiguration {
configurationType: WidgetConfigurationType
@@ -808,7 +809,7 @@ export interface AggregateChartConfiguration {
__typename: 'AggregateChartConfiguration'
}
export type WidgetConfigurationType = 'AGGREGATE_CHART' | 'GAUGE_CHART' | 'PIE_CHART' | 'BAR_CHART' | 'LINE_CHART' | 'IFRAME' | 'STANDALONE_RICH_TEXT' | 'VIEW' | 'FIELD' | 'FIELDS' | 'TIMELINE' | 'TASKS' | 'NOTES' | 'FILES' | 'EMAILS' | 'CALENDAR' | 'FIELD_RICH_TEXT' | 'WORKFLOW' | 'WORKFLOW_VERSION' | 'WORKFLOW_RUN' | 'FRONT_COMPONENT' | 'RECORD_TABLE' | 'EMAIL_THREAD'
export type WidgetConfigurationType = 'AGGREGATE_CHART' | 'PIE_CHART' | 'BAR_CHART' | 'LINE_CHART' | 'IFRAME' | 'STANDALONE_RICH_TEXT' | 'VIEW' | 'FIELD' | 'FIELDS' | 'TIMELINE' | 'TASKS' | 'NOTES' | 'FILES' | 'EMAILS' | 'CALENDAR' | 'FIELD_RICH_TEXT' | 'WORKFLOW' | 'WORKFLOW_VERSION' | 'WORKFLOW_RUN' | 'FRONT_COMPONENT' | 'RECORD_TABLE' | 'EMAIL_THREAD'
export interface StandaloneRichTextConfiguration {
configurationType: WidgetConfigurationType
@@ -887,19 +888,6 @@ export interface IframeConfiguration {
__typename: 'IframeConfiguration'
}
export interface GaugeChartConfiguration {
configurationType: WidgetConfigurationType
aggregateFieldMetadataId: Scalars['UUID']
aggregateOperation: AggregateOperations
displayDataLabel?: Scalars['Boolean']
color?: Scalars['String']
description?: Scalars['String']
filter?: Scalars['JSON']
timezone?: Scalars['String']
firstDayOfTheWeek?: Scalars['Int']
__typename: 'GaugeChartConfiguration'
}
export interface BarChartConfiguration {
configurationType: WidgetConfigurationType
aggregateFieldMetadataId: Scalars['UUID']
@@ -965,12 +953,13 @@ export interface FieldConfiguration {
configurationType: WidgetConfigurationType
fieldMetadataId: Scalars['String']
fieldDisplayMode: FieldDisplayMode
viewId?: Scalars['String']
__typename: 'FieldConfiguration'
}
/** Display mode for field configuration widgets */
export type FieldDisplayMode = 'CARD' | 'EDITOR' | 'FIELD' | 'VIEW'
export type FieldDisplayMode = 'CARD' | 'EDITOR' | 'FIELD' | 'VIEW' | 'TABLE'
export interface FieldRichTextConfiguration {
configurationType: WidgetConfigurationType
@@ -1105,6 +1094,35 @@ export interface Analytics {
__typename: 'Analytics'
}
export interface VerificationRecord {
type: Scalars['String']
key: Scalars['String']
value: Scalars['String']
priority?: Scalars['Float']
__typename: 'VerificationRecord'
}
export interface EmailingDomain {
id: Scalars['UUID']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
domain: Scalars['String']
driver: EmailingDomainDriver
status: EmailingDomainStatus
verificationRecords?: VerificationRecord[]
verifiedAt?: Scalars['DateTime']
__typename: 'EmailingDomain'
}
export type EmailingDomainDriver = 'AWS_SES'
export type EmailingDomainStatus = 'PENDING' | 'VERIFIED' | 'FAILED' | 'TEMPORARY_FAILURE'
export interface SendEmailViaDomainOutput {
messageId: Scalars['String']
__typename: 'SendEmailViaDomainOutput'
}
export interface ApprovedAccessDomain {
id: Scalars['UUID']
domain: Scalars['String']
@@ -1393,7 +1411,7 @@ export interface FeatureFlag {
__typename: 'FeatureFlag'
}
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_EMAIL_GROUP_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT'
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAIL_GROUP_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT'
export interface WorkspaceUrls {
customUrl?: Scalars['String']
@@ -2049,30 +2067,6 @@ export interface PublicDomain {
__typename: 'PublicDomain'
}
export interface VerificationRecord {
type: Scalars['String']
key: Scalars['String']
value: Scalars['String']
priority?: Scalars['Float']
__typename: 'VerificationRecord'
}
export interface EmailingDomain {
id: Scalars['UUID']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
domain: Scalars['String']
driver: EmailingDomainDriver
status: EmailingDomainStatus
verificationRecords?: VerificationRecord[]
verifiedAt?: Scalars['DateTime']
__typename: 'EmailingDomain'
}
export type EmailingDomainDriver = 'AWS_SES'
export type EmailingDomainStatus = 'PENDING' | 'VERIFIED' | 'FAILED' | 'TEMPORARY_FAILURE'
export interface AutocompleteResult {
text: Scalars['String']
placeId: Scalars['String']
@@ -2570,6 +2564,7 @@ export interface Query {
getPageLayoutTab: PageLayoutTab
getPageLayouts: PageLayout[]
getPageLayout?: PageLayout
getEmailingDomains: EmailingDomain[]
applicationConnectionProviders: ApplicationConnectionProvider[]
getPageLayoutWidgets: PageLayoutWidget[]
getPageLayoutWidget: PageLayoutWidget
@@ -2637,7 +2632,6 @@ export interface Query {
getAddressDetails: PlaceDetailsResult
getUsageAnalytics: UsageAnalytics
findManyPublicDomains: PublicDomain[]
getEmailingDomains: EmailingDomain[]
findManyMarketplaceApps: MarketplaceApp[]
findMarketplaceAppDetail: MarketplaceAppDetail
__typename: 'Query'
@@ -2725,6 +2719,10 @@ export interface Mutation {
resetPageLayoutToDefault: PageLayout
resetPageLayoutWidgetToDefault: PageLayoutWidget
resetPageLayoutTabToDefault: PageLayoutTab
createEmailingDomain: EmailingDomain
deleteEmailingDomain: Scalars['Boolean']
verifyEmailingDomain: EmailingDomain
sendEmailViaEmailingDomain: SendEmailViaDomainOutput
updateOneApplicationVariable: Scalars['Boolean']
createPageLayoutWidget: PageLayoutWidget
updatePageLayoutWidget: PageLayoutWidget
@@ -2742,6 +2740,8 @@ export interface Mutation {
createOneObject: Object
deleteOneObject: Object
updateOneObject: Object
createOneIndex: Index
deleteOneIndex: Index
createOneAgent: Agent
updateOneAgent: Agent
deleteOneAgent: Agent
@@ -2843,9 +2843,6 @@ export interface Mutation {
updatePublicDomain: PublicDomain
deletePublicDomain: Scalars['Boolean']
checkPublicDomainValidRecords?: DomainValidRecords
createEmailingDomain: EmailingDomain
deleteEmailingDomain: Scalars['Boolean']
verifyEmailingDomain: EmailingDomain
createOneAppToken: AppToken
/** @deprecated Use installApplication instead */
installMarketplaceApp: Scalars['Boolean']
@@ -3257,6 +3254,7 @@ export interface IndexFieldGenqlSelection{
id?: boolean | number
fieldMetadataId?: boolean | number
order?: boolean | number
subFieldName?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
__typename?: boolean | number
@@ -3699,7 +3697,6 @@ export interface WidgetConfigurationGenqlSelection{
on_PieChartConfiguration?:PieChartConfigurationGenqlSelection,
on_LineChartConfiguration?:LineChartConfigurationGenqlSelection,
on_IframeConfiguration?:IframeConfigurationGenqlSelection,
on_GaugeChartConfiguration?:GaugeChartConfigurationGenqlSelection,
on_BarChartConfiguration?:BarChartConfigurationGenqlSelection,
on_CalendarConfiguration?:CalendarConfigurationGenqlSelection,
on_FrontComponentConfiguration?:FrontComponentConfigurationGenqlSelection,
@@ -3807,20 +3804,6 @@ export interface IframeConfigurationGenqlSelection{
__scalar?: boolean | number
}
export interface GaugeChartConfigurationGenqlSelection{
configurationType?: boolean | number
aggregateFieldMetadataId?: boolean | number
aggregateOperation?: boolean | number
displayDataLabel?: boolean | number
color?: boolean | number
description?: boolean | number
filter?: boolean | number
timezone?: boolean | number
firstDayOfTheWeek?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface BarChartConfigurationGenqlSelection{
configurationType?: boolean | number
aggregateFieldMetadataId?: boolean | number
@@ -3883,6 +3866,7 @@ export interface FieldConfigurationGenqlSelection{
configurationType?: boolean | number
fieldMetadataId?: boolean | number
fieldDisplayMode?: boolean | number
viewId?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
@@ -4036,6 +4020,34 @@ export interface AnalyticsGenqlSelection{
__scalar?: boolean | number
}
export interface VerificationRecordGenqlSelection{
type?: boolean | number
key?: boolean | number
value?: boolean | number
priority?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface EmailingDomainGenqlSelection{
id?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
domain?: boolean | number
driver?: boolean | number
status?: boolean | number
verificationRecords?: VerificationRecordGenqlSelection
verifiedAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface SendEmailViaDomainOutputGenqlSelection{
messageId?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface ApprovedAccessDomainGenqlSelection{
id?: boolean | number
domain?: boolean | number
@@ -5047,28 +5059,6 @@ export interface PublicDomainGenqlSelection{
__scalar?: boolean | number
}
export interface VerificationRecordGenqlSelection{
type?: boolean | number
key?: boolean | number
value?: boolean | number
priority?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface EmailingDomainGenqlSelection{
id?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
domain?: boolean | number
driver?: boolean | number
status?: boolean | number
verificationRecords?: VerificationRecordGenqlSelection
verifiedAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface AutocompleteResultGenqlSelection{
text?: boolean | number
placeId?: boolean | number
@@ -5584,6 +5574,7 @@ export interface QueryGenqlSelection{
getPageLayoutTab?: (PageLayoutTabGenqlSelection & { __args: {id: Scalars['String']} })
getPageLayouts?: (PageLayoutGenqlSelection & { __args?: {objectMetadataId?: (Scalars['String'] | null), pageLayoutType?: (PageLayoutType | null)} })
getPageLayout?: (PageLayoutGenqlSelection & { __args: {id: Scalars['String']} })
getEmailingDomains?: EmailingDomainGenqlSelection
applicationConnectionProviders?: (ApplicationConnectionProviderGenqlSelection & { __args: {applicationId: Scalars['UUID']} })
getPageLayoutWidgets?: (PageLayoutWidgetGenqlSelection & { __args: {pageLayoutTabId: Scalars['String']} })
getPageLayoutWidget?: (PageLayoutWidgetGenqlSelection & { __args: {id: Scalars['String']} })
@@ -5669,7 +5660,6 @@ export interface QueryGenqlSelection{
getAddressDetails?: (PlaceDetailsResultGenqlSelection & { __args: {placeId: Scalars['String'], token: Scalars['String']} })
getUsageAnalytics?: (UsageAnalyticsGenqlSelection & { __args?: {input?: (UsageAnalyticsInput | null)} })
findManyPublicDomains?: PublicDomainGenqlSelection
getEmailingDomains?: EmailingDomainGenqlSelection
findManyMarketplaceApps?: MarketplaceAppGenqlSelection
findMarketplaceAppDetail?: (MarketplaceAppDetailGenqlSelection & { __args: {universalIdentifier: Scalars['String']} })
__typename?: boolean | number
@@ -5778,6 +5768,10 @@ export interface MutationGenqlSelection{
resetPageLayoutToDefault?: (PageLayoutGenqlSelection & { __args: {id: Scalars['String']} })
resetPageLayoutWidgetToDefault?: (PageLayoutWidgetGenqlSelection & { __args: {id: Scalars['String']} })
resetPageLayoutTabToDefault?: (PageLayoutTabGenqlSelection & { __args: {id: Scalars['String']} })
createEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {domain: Scalars['String'], driver: EmailingDomainDriver} })
deleteEmailingDomain?: { __args: {id: Scalars['String']} }
verifyEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {id: Scalars['String']} })
sendEmailViaEmailingDomain?: (SendEmailViaDomainOutputGenqlSelection & { __args: {input: SendEmailViaDomainInput} })
updateOneApplicationVariable?: { __args: {key: Scalars['String'], value: Scalars['String'], applicationId: Scalars['UUID']} }
createPageLayoutWidget?: (PageLayoutWidgetGenqlSelection & { __args: {input: CreatePageLayoutWidgetInput} })
updatePageLayoutWidget?: (PageLayoutWidgetGenqlSelection & { __args: {id: Scalars['String'], input: UpdatePageLayoutWidgetInput} })
@@ -5795,6 +5789,8 @@ export interface MutationGenqlSelection{
createOneObject?: (ObjectGenqlSelection & { __args: {input: CreateOneObjectInput} })
deleteOneObject?: (ObjectGenqlSelection & { __args: {input: DeleteOneObjectInput} })
updateOneObject?: (ObjectGenqlSelection & { __args: {input: UpdateOneObjectInput} })
createOneIndex?: (IndexGenqlSelection & { __args: {input: CreateOneIndexInput} })
deleteOneIndex?: (IndexGenqlSelection & { __args: {input: DeleteOneIndexInput} })
createOneAgent?: (AgentGenqlSelection & { __args: {input: CreateAgentInput} })
updateOneAgent?: (AgentGenqlSelection & { __args: {input: UpdateAgentInput} })
deleteOneAgent?: (AgentGenqlSelection & { __args: {input: AgentIdInput} })
@@ -5896,9 +5892,6 @@ export interface MutationGenqlSelection{
updatePublicDomain?: (PublicDomainGenqlSelection & { __args: {domain: Scalars['String'], applicationId?: (Scalars['String'] | null)} })
deletePublicDomain?: { __args: {domain: Scalars['String']} }
checkPublicDomainValidRecords?: (DomainValidRecordsGenqlSelection & { __args: {domain: Scalars['String']} })
createEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {domain: Scalars['String'], driver: EmailingDomainDriver} })
deleteEmailingDomain?: { __args: {id: Scalars['String']} }
verifyEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {id: Scalars['String']} })
createOneAppToken?: (AppTokenGenqlSelection & { __args: {input: CreateOneAppTokenInput} })
/** @deprecated Use installApplication instead */
installMarketplaceApp?: { __args: {universalIdentifier: Scalars['String'], version?: (Scalars['String'] | null)} }
@@ -6076,6 +6069,8 @@ export interface UpdatePageLayoutWidgetWithIdInput {id: Scalars['UUID'],pageLayo
export interface GridPositionInput {row: Scalars['Float'],column: Scalars['Float'],rowSpan: Scalars['Float'],columnSpan: Scalars['Float']}
export interface SendEmailViaDomainInput {emailingDomainId: Scalars['String'],to: Scalars['String'][],cc?: (Scalars['String'][] | null),bcc?: (Scalars['String'][] | null),subject: Scalars['String'],text: Scalars['String'],html?: (Scalars['String'] | null),from: Scalars['String'],replyTo?: (Scalars['String'][] | null)}
export interface CreatePageLayoutWidgetInput {pageLayoutTabId: Scalars['UUID'],title: Scalars['String'],type: WidgetType,objectMetadataId?: (Scalars['UUID'] | null),gridPosition: GridPositionInput,position?: (Scalars['JSON'] | null),configuration: Scalars['JSON']}
export interface UpdatePageLayoutWidgetInput {pageLayoutTabId?: (Scalars['UUID'] | null),title?: (Scalars['String'] | null),type?: (WidgetType | null),objectMetadataId?: (Scalars['UUID'] | null),gridPosition?: (GridPositionInput | null),position?: (Scalars['JSON'] | null),configuration?: (Scalars['JSON'] | null),conditionalDisplay?: (Scalars['JSON'] | null),conditionalAvailabilityExpression?: (Scalars['String'] | null)}
@@ -6126,6 +6121,18 @@ id: Scalars['UUID']}
export interface UpdateObjectPayload {labelSingular?: (Scalars['String'] | null),labelPlural?: (Scalars['String'] | null),nameSingular?: (Scalars['String'] | null),namePlural?: (Scalars['String'] | null),description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),shortcut?: (Scalars['String'] | null),color?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null),labelIdentifierFieldMetadataId?: (Scalars['UUID'] | null),imageIdentifierFieldMetadataId?: (Scalars['UUID'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null),isSearchable?: (Scalars['Boolean'] | null)}
export interface CreateOneIndexInput {
/** The custom index to create */
index: CreateIndexInput}
export interface CreateIndexInput {objectMetadataId: Scalars['UUID'],fields: CreateIndexFieldInput[],indexType: IndexType}
export interface CreateIndexFieldInput {fieldMetadataId: Scalars['UUID'],subFieldName?: (Scalars['String'] | null)}
export interface DeleteOneIndexInput {
/** The id of the custom index to delete. */
id: Scalars['UUID']}
export interface CreateAgentInput {name?: (Scalars['String'] | null),label: Scalars['String'],icon?: (Scalars['String'] | null),description?: (Scalars['String'] | null),prompt: Scalars['String'],modelId: Scalars['String'],roleId?: (Scalars['UUID'] | null),responseFormat?: (Scalars['JSON'] | null),modelConfiguration?: (Scalars['JSON'] | null),evaluationInputs?: (Scalars['String'][] | null)}
export interface UpdateAgentInput {id: Scalars['UUID'],name?: (Scalars['String'] | null),label?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),description?: (Scalars['String'] | null),prompt?: (Scalars['String'] | null),modelId?: (Scalars['String'] | null),roleId?: (Scalars['UUID'] | null),responseFormat?: (Scalars['JSON'] | null),modelConfiguration?: (Scalars['JSON'] | null),evaluationInputs?: (Scalars['String'][] | null)}
@@ -6142,7 +6149,7 @@ export interface UpsertObjectPermissionsInput {roleId: Scalars['UUID'],objectPer
export interface ObjectPermissionInput {objectMetadataId: Scalars['UUID'],canReadObjectRecords?: (Scalars['Boolean'] | null),canUpdateObjectRecords?: (Scalars['Boolean'] | null),canSoftDeleteObjectRecords?: (Scalars['Boolean'] | null),canDestroyObjectRecords?: (Scalars['Boolean'] | null)}
export interface UpsertPermissionFlagsInput {roleId: Scalars['UUID'],permissionFlagKeys: PermissionFlagType[]}
export interface UpsertPermissionFlagsInput {roleId: Scalars['UUID'],permissionFlagKeys: Scalars['String'][]}
export interface UpsertFieldPermissionsInput {roleId: Scalars['UUID'],fieldPermissions: FieldPermissionInput[]}
@@ -6689,7 +6696,7 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const WidgetConfiguration_possibleTypes: string[] = ['AggregateChartConfiguration','StandaloneRichTextConfiguration','PieChartConfiguration','LineChartConfiguration','IframeConfiguration','GaugeChartConfiguration','BarChartConfiguration','CalendarConfiguration','FrontComponentConfiguration','EmailsConfiguration','EmailThreadConfiguration','FieldConfiguration','FieldRichTextConfiguration','FieldsConfiguration','FilesConfiguration','NotesConfiguration','TasksConfiguration','TimelineConfiguration','ViewConfiguration','RecordTableConfiguration','WorkflowConfiguration','WorkflowRunConfiguration','WorkflowVersionConfiguration']
const WidgetConfiguration_possibleTypes: string[] = ['AggregateChartConfiguration','StandaloneRichTextConfiguration','PieChartConfiguration','LineChartConfiguration','IframeConfiguration','BarChartConfiguration','CalendarConfiguration','FrontComponentConfiguration','EmailsConfiguration','EmailThreadConfiguration','FieldConfiguration','FieldRichTextConfiguration','FieldsConfiguration','FilesConfiguration','NotesConfiguration','TasksConfiguration','TimelineConfiguration','ViewConfiguration','RecordTableConfiguration','WorkflowConfiguration','WorkflowRunConfiguration','WorkflowVersionConfiguration']
export const isWidgetConfiguration = (obj?: { __typename?: any } | null): obj is WidgetConfiguration => {
if (!obj?.__typename) throw new Error('__typename is missing in "isWidgetConfiguration"')
return WidgetConfiguration_possibleTypes.includes(obj.__typename)
@@ -6737,14 +6744,6 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const GaugeChartConfiguration_possibleTypes: string[] = ['GaugeChartConfiguration']
export const isGaugeChartConfiguration = (obj?: { __typename?: any } | null): obj is GaugeChartConfiguration => {
if (!obj?.__typename) throw new Error('__typename is missing in "isGaugeChartConfiguration"')
return GaugeChartConfiguration_possibleTypes.includes(obj.__typename)
}
const BarChartConfiguration_possibleTypes: string[] = ['BarChartConfiguration']
export const isBarChartConfiguration = (obj?: { __typename?: any } | null): obj is BarChartConfiguration => {
if (!obj?.__typename) throw new Error('__typename is missing in "isBarChartConfiguration"')
@@ -6937,6 +6936,30 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const VerificationRecord_possibleTypes: string[] = ['VerificationRecord']
export const isVerificationRecord = (obj?: { __typename?: any } | null): obj is VerificationRecord => {
if (!obj?.__typename) throw new Error('__typename is missing in "isVerificationRecord"')
return VerificationRecord_possibleTypes.includes(obj.__typename)
}
const EmailingDomain_possibleTypes: string[] = ['EmailingDomain']
export const isEmailingDomain = (obj?: { __typename?: any } | null): obj is EmailingDomain => {
if (!obj?.__typename) throw new Error('__typename is missing in "isEmailingDomain"')
return EmailingDomain_possibleTypes.includes(obj.__typename)
}
const SendEmailViaDomainOutput_possibleTypes: string[] = ['SendEmailViaDomainOutput']
export const isSendEmailViaDomainOutput = (obj?: { __typename?: any } | null): obj is SendEmailViaDomainOutput => {
if (!obj?.__typename) throw new Error('__typename is missing in "isSendEmailViaDomainOutput"')
return SendEmailViaDomainOutput_possibleTypes.includes(obj.__typename)
}
const ApprovedAccessDomain_possibleTypes: string[] = ['ApprovedAccessDomain']
export const isApprovedAccessDomain = (obj?: { __typename?: any } | null): obj is ApprovedAccessDomain => {
if (!obj?.__typename) throw new Error('__typename is missing in "isApprovedAccessDomain"')
@@ -7841,22 +7864,6 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const VerificationRecord_possibleTypes: string[] = ['VerificationRecord']
export const isVerificationRecord = (obj?: { __typename?: any } | null): obj is VerificationRecord => {
if (!obj?.__typename) throw new Error('__typename is missing in "isVerificationRecord"')
return VerificationRecord_possibleTypes.includes(obj.__typename)
}
const EmailingDomain_possibleTypes: string[] = ['EmailingDomain']
export const isEmailingDomain = (obj?: { __typename?: any } | null): obj is EmailingDomain => {
if (!obj?.__typename) throw new Error('__typename is missing in "isEmailingDomain"')
return EmailingDomain_possibleTypes.includes(obj.__typename)
}
const AutocompleteResult_possibleTypes: string[] = ['AutocompleteResult']
export const isAutocompleteResult = (obj?: { __typename?: any } | null): obj is AutocompleteResult => {
if (!obj?.__typename) throw new Error('__typename is missing in "isAutocompleteResult"')
@@ -8542,7 +8549,6 @@ export const enumPageLayoutTabLayoutMode = {
export const enumWidgetConfigurationType = {
AGGREGATE_CHART: 'AGGREGATE_CHART' as const,
GAUGE_CHART: 'GAUGE_CHART' as const,
PIE_CHART: 'PIE_CHART' as const,
BAR_CHART: 'BAR_CHART' as const,
LINE_CHART: 'LINE_CHART' as const,
@@ -8609,7 +8615,8 @@ export const enumFieldDisplayMode = {
CARD: 'CARD' as const,
EDITOR: 'EDITOR' as const,
FIELD: 'FIELD' as const,
VIEW: 'VIEW' as const
VIEW: 'VIEW' as const,
TABLE: 'TABLE' as const
}
export const enumPageLayoutType = {
@@ -8619,6 +8626,17 @@ export const enumPageLayoutType = {
STANDALONE_PAGE: 'STANDALONE_PAGE' as const
}
export const enumEmailingDomainDriver = {
AWS_SES: 'AWS_SES' as const
}
export const enumEmailingDomainStatus = {
PENDING: 'PENDING' as const,
VERIFIED: 'VERIFIED' as const,
FAILED: 'FAILED' as const,
TEMPORARY_FAILURE: 'TEMPORARY_FAILURE' as const
}
export const enumBillingPlanKey = {
PRO: 'PRO' as const,
ENTERPRISE: 'ENTERPRISE' as const
@@ -8685,7 +8703,6 @@ export const enumFeatureFlagKey = {
IS_JSON_FILTER_ENABLED: 'IS_JSON_FILTER_ENABLED' as const,
IS_MARKETPLACE_SETTING_TAB_VISIBLE: 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' as const,
IS_PUBLIC_DOMAIN_ENABLED: 'IS_PUBLIC_DOMAIN_ENABLED' as const,
IS_EMAILING_DOMAIN_ENABLED: 'IS_EMAILING_DOMAIN_ENABLED' as const,
IS_EMAIL_GROUP_ENABLED: 'IS_EMAIL_GROUP_ENABLED' as const,
IS_JUNCTION_RELATIONS_ENABLED: 'IS_JUNCTION_RELATIONS_ENABLED' as const,
IS_REST_METADATA_API_NEW_FORMAT_DIRECT: 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT' as const
@@ -8732,17 +8749,6 @@ export const enumBillingEntitlementKey = {
AUDIT_LOGS: 'AUDIT_LOGS' as const
}
export const enumEmailingDomainDriver = {
AWS_SES: 'AWS_SES' as const
}
export const enumEmailingDomainStatus = {
PENDING: 'PENDING' as const,
VERIFIED: 'VERIFIED' as const,
FAILED: 'FAILED' as const,
TEMPORARY_FAILURE: 'TEMPORARY_FAILURE' as const
}
export const enumCalendarChannelSyncStatus = {
NOT_SYNCED: 'NOT_SYNCED' as const,
ONGOING: 'ONGOING' as const,
File diff suppressed because it is too large Load Diff
@@ -40,6 +40,7 @@ export default defineField({
- When defining fields **inline inside `defineObject()`**, you do **not** need `objectUniversalIdentifier` — it's inherited from the parent object.
- `defineField()` is the only way to add fields to objects you didn't create with `defineObject()`.
- File location is up to you. The convention is `src/fields/<name>.field.ts`, but the SDK detects fields anywhere in `src/`.
- To add a tab to a standard page layout (e.g. the Task or Company detail page), use [`definePageLayoutTab`](/developers/extend/apps/layout/page-layouts#definepagelayouttab) with `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` from `twenty-sdk/define`.
## Adding a relation to an existing object
@@ -44,8 +44,53 @@ A Twenty app's **data layer** is the data your app *adds* to a workspace — the
| **Object** | A new custom record type (e.g. PostCard, Invoice) with its own fields | `defineObject()` |
| **Field** | A column on an object. Standalone fields can extend objects you didn't create (e.g. add `loyaltyTier` to Company) | `defineField()` |
| **Relation** | A bidirectional link between two objects — both sides declared as fields | `defineField()` with `FieldType.RELATION` |
| **Index** | A database index to speed up a recurring query on one of your objects | `defineIndex()` |
The SDK detects these via AST analysis at build time, so file organization is up to you — the convention is `src/objects/` and `src/fields/`. Stable `universalIdentifier` UUIDs tie everything together across deploys.
The SDK detects these via AST analysis at build time, so file organization is up to you — the convention is `src/objects/`, `src/fields/`, and `src/indexes/`. Stable `universalIdentifier` UUIDs tie everything together across deploys.
## Indexes (optional)
Apps can ship indexes alongside their objects to keep recurring queries fast. The most common case is a status or foreign-key column that you read frequently.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Unique indexes
`defineIndex` accepts `isUnique: true` for both single- and multi-column uniqueness. This is the recommended primitive — `defineField({ isUnique: true })` is deprecated and will be removed in a future release.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Other constraints
- Partial `WHERE` clauses stay under admin control — apps can't declare them.
- Each object is capped at 10 custom indexes (the framework's own indexes don't count).
Order the `fields` array the way Postgres should use it — leftmost column first, like a phone book. Indexes are not free: every write to the table updates them. Add one only when you have a query that needs it.
<Note>
Looking for **Application Config** or **Roles & Permissions**? Those describe the app itself rather than the data it adds — they live under [Config](/developers/extend/apps/config/overview). Looking for **Connections** (Linear, GitHub, Slack OAuth)? Those exist to be called *from* logic functions and live under [Logic](/developers/extend/apps/logic/connections).
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` already implies a non-empty selection — use `numberOfSelectedRecords` only for specific counts (e.g. `>= 2`).
</Note>
### Context variables
These represent the current state of the page:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Calling a logic function
Front components run browser-side in a sandboxed Web Worker, while [logic functions](/developers/extend/apps/logic/logic-functions) run server-side. There is no direct in-process call between the two — instead, a front component reaches a logic function over HTTP.
A logic function declared with `httpRouteTriggerSettings` is exposed under the `/s/` endpoint at `${TWENTY_API_URL}/s<path>`. Your front component calls that route with `fetch`, authenticating with the `TWENTY_APP_ACCESS_TOKEN` that Twenty injects into the worker.
A small reusable helper keeps the call sites clean:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
A headless front component can run the call on mount via the `Command` component, then unmount automatically:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
The `path` passed to `callAppRoute` must match the logic function's `httpRouteTriggerSettings.path` (the `/s` prefix is added by the helper):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` and `TWENTY_APP_ACCESS_TOKEN` are injected automatically — see [Application variables](#application-variables). Because secret application variables are never exposed to front components, keep API keys and other sensitive logic in the logic function, not in the front component.
</Note>
## Accessing runtime context
Inside your component, use SDK hooks to access the current user, record, and component instance:
@@ -65,16 +65,15 @@ Use this when you only want to **add** a tab to an existing layout — for examp
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,34 @@ export default definePageLayoutTab({
### Key points
- `pageLayoutUniversalIdentifier` is **required** and must point to a page layout that already exists at install time — either a standard Twenty layout or one defined by your own app. Cross-app references to layouts owned by another installed app are not supported today. When the parent layout is missing, installation fails with a clear validation error.
- For standard Twenty layouts, import identifiers from `twenty-sdk/define`:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Each layout entry also exposes its `tabs` and their `widgets`, so you can reference any level:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
A short alias `STANDARD_PAGE_LAYOUT` is also available:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
- `widgets` are scoped to this tab only — they reference [front components](/developers/extend/apps/layout/front-components), views, etc. exactly like widgets defined inline in `definePageLayout`.
- `position` controls ordering against existing tabs on the targeted layout. Pick a value that places your tab where you want it relative to built-in tabs.
- Use this instead of `definePageLayout` when you only want to add to an existing layout. Use `definePageLayout` when you own the entire layout.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Field types with similar names can use entirely different operands — `SELECT` and `MULTI_SELECT` being a common case.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Available trigger types:
- **httpRoute**: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
> e.g. `path: '/post-card/create'` is callable at `https://your-twenty-server.com/s/post-card/create`
<Note>
To invoke a route-triggered logic function from a (headless) front component, see [Calling a logic function](/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
- **cron**: Runs your function on a schedule using a CRON expression.
- **databaseEvent**: Runs on workspace object lifecycle events. When the event operation is `updated`, specific fields to listen to can be specified in the `updatedFields` array. If left undefined or empty, any update will trigger the function.
> e.g. `person.updated`, `*.created`, `company.*`
@@ -43,6 +43,8 @@ export default defineField({
* Der Speicherort der Datei liegt bei Ihnen. Die Konvention ist `src/fields/\<name>.field.ts`, aber das SDK erkennt Felder überall in `src/`.
* Um eine Registerkarte zu einem Standard-Seitenlayout hinzuzufügen (z. B. der Aufgaben- oder Unternehmensdetailseite), verwenden Sie [`definePageLayoutTab`](/l/de/developers/extend/apps/layout/page-layouts#definepagelayouttab) mit `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` aus `twenty-sdk/define`.
## Hinzufügen einer Relation zu einem bestehenden Objekt
Um ein Relationsfeld hinzuzufügen (z. B. zur Verknüpfung Ihres benutzerdefinierten Objekts mit einer Standard-`Person`), verwenden Sie `defineField()` mit `FieldType.RELATION`. Das Muster ist dasselbe wie bei Inline-Relationen, jedoch mit explizit gesetztem `objectUniversalIdentifier`. Siehe [Relations](/l/de/developers/extend/apps/data/relations) für das bidirektionale Muster.
@@ -44,8 +44,53 @@ Die **Datenebene** einer Twenty-App umfasst die Daten, die Ihre App zu einem Wor
| **Objekt** | Ein neuer benutzerdefinierter Datensatztyp (z. B. PostCard, Invoice) mit eigenen Feldern | `defineObject()` |
| **Feld** | Eine Spalte in einem Objekt. Eigenständige Felder können Objekte erweitern, die Sie nicht erstellt haben (z. B. `loyaltyTier` zu Company hinzufügen) | `defineField()` |
| **Beziehung** | Eine bidirektionale Verknüpfung zwischen zwei Objekten beide Seiten werden als Felder deklariert | `defineField()` mit `FieldType.RELATION` |
| **Indizes** | Ein Datenbankindex, um eine wiederkehrende Abfrage für eines Ihrer Objekte zu beschleunigen | `defineIndex()` |
Das SDK erkennt diese zur Build-Zeit über eine AST-Analyse, sodass die Dateiorganisation Ihnen überlassen ist die Konvention ist `src/objects/` und `src/fields/`. Stabile `universalIdentifier`-UUIDs verknüpfen alles über Deploys hinweg.
Das SDK erkennt diese zur Build-Zeit über eine AST-Analyse, sodass die Dateiorganisation Ihnen überlassen ist die Konvention ist `src/objects/`, `src/fields/` und `src/indexes/`. Stabile `universalIdentifier`-UUIDs verknüpfen alles über Deploys hinweg.
## Indizes (optional)
Apps können Indizes gemeinsam mit ihren Objekten ausliefern, um wiederkehrende Abfragen schnell zu halten. Der häufigste Fall ist eine Status- oder Fremdschlüsselspalte, die Sie häufig lesen.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Eindeutige Indizes
`defineIndex` akzeptiert `isUnique: true` sowohl für Einspalten- als auch Mehrspalteneindeutigkeit. Dies ist das empfohlene Primitive `defineField({ isUnique: true })` ist veraltet und wird in einer zukünftigen Version entfernt.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Andere Einschränkungen
* Partielle `WHERE`-Klauseln bleiben unter Kontrolle der Administratoren Apps können sie nicht deklarieren.
* Jedes Objekt ist auf 10 benutzerdefinierte Indizes begrenzt (die Indizes des Frameworks selbst werden nicht mitgezählt).
Ordnen Sie das `fields`-Array so an, wie Postgres es verwenden soll die ganz linke Spalte zuerst, wie in einem Telefonbuch. Indizes sind nicht kostenlos: Jeder Schreibvorgang in die Tabelle aktualisiert sie. Fügen Sie einen nur dann hinzu, wenn Sie eine Abfrage haben, die ihn benötigt.
<Note>
Suchen Sie nach **Application Config** oder **Roles & Permissions**? Diese beschreiben die App selbst und nicht die Daten, die sie hinzufügt sie befinden sich unter [Config](/l/de/developers/extend/apps/config/overview). Suchen Sie nach **Connections** (Linear, GitHub, Slack OAuth)? Diese existieren, um *von* Logikfunktionen aufgerufen zu werden, und befinden sich unter [Logic](/l/de/developers/extend/apps/logic/connections).
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` impliziert bereits eine nichtleere Auswahl — verwende `numberOfSelectedRecords` nur für bestimmte Zählwerte (z. B. `>= 2`).
</Note>
### Kontextvariablen
Diese repräsentieren den aktuellen Zustand der Seite:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Aufrufen einer Logikfunktion
Front-Komponenten laufen browserseitig in einem isolierten Web Worker, während [Logikfunktionen](/l/de/developers/extend/apps/logic/logic-functions) serverseitig ausgeführt werden. Es gibt keinen direkten In-Process-Aufruf zwischen beiden stattdessen ruft eine Front-Komponente eine Logikfunktion über HTTP auf.
Eine mit `httpRouteTriggerSettings` deklarierte Logikfunktion wird unter dem `/s/`-Endpunkt unter `${TWENTY_API_URL}/s\<path>` bereitgestellt. Ihre Front-Komponente ruft diese Route mit `fetch` auf und authentifiziert sich dabei mit dem `TWENTY_APP_ACCESS_TOKEN`, das Twenty in den Worker injiziert.
Ein kleiner wiederverwendbarer Helper hält die Aufrufstellen übersichtlich:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
Eine headless Front-Komponente kann den Aufruf beim Mounten über die `Command`-Komponente ausführen und sich anschließend automatisch unmounten:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
Der an `callAppRoute` übergebene `path` muss dem `httpRouteTriggerSettings.path` der Logikfunktion entsprechen (das `/s`-Präfix wird vom Helper hinzugefügt):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` und `TWENTY_APP_ACCESS_TOKEN` werden automatisch injiziert siehe [Anwendungsvariablen](#application-variables). Da geheime Anwendungsvariablen niemals in Front-Komponenten offengelegt werden, sollten API-Schlüssel und andere sensible Logik in der Logikfunktion verbleiben und nicht in der Front-Komponente.
</Note>
## Zugriff auf den Laufzeitkontext
Verwenden Sie innerhalb Ihrer Komponente SDK-Hooks, um auf den aktuellen Benutzer, den Datensatz und die Komponenteninstanz zuzugreifen:
@@ -65,16 +65,15 @@ Verwenden Sie dies, wenn Sie nur einen Tab zu einem vorhandenen Layout **hinzuf
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### Hauptpunkte
* `pageLayoutUniversalIdentifier` ist **erforderlich** und muss auf ein Seitenlayout verweisen, das zum Installationszeitpunkt bereits existiert entweder ein standardmäßiges Twenty-Layout oder eines, das von Ihrer eigenen App definiert wurde. App-übergreifende Verweise auf Layouts, die einer anderen installierten App gehören, werden derzeit nicht unterstützt. Wenn das übergeordnete Layout fehlt, schlägt die Installation mit einem eindeutigen Validierungsfehler fehl.
* Für Standard-Twenty-Layouts importieren Sie die Bezeichner aus `twenty-sdk/define`:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Jeder Layout-Eintrag stellt außerdem seine `tabs` und deren `widgets` zur Verfügung, sodass Sie auf jede Ebene verweisen können:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
Eine kurze Alias-Variable `STANDARD_PAGE_LAYOUT` ist ebenfalls verfügbar:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` sind ausschließlich auf diesen Tab beschränkt sie verweisen auf [Frontend-Komponenten](/l/de/developers/extend/apps/layout/front-components), Ansichten usw., genau wie Widgets, die inline in `definePageLayout` definiert sind.
* `position` steuert die Reihenfolge im Zielseitenlayout relativ zu den vorhandenen Registerkarten. Wählen Sie einen Wert, der Ihre Registerkarte relativ zu integrierten Registerkarten an die gewünschte Position bringt.
* Verwenden Sie dies anstelle von `definePageLayout`, wenn Sie einem vorhandenen Layout nur etwas hinzufügen möchten. Verwenden Sie `definePageLayout`, wenn Sie das gesamte Layout besitzen.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Feldtypen mit ähnlichen Namen können völlig unterschiedliche Operanden verwenden `SELECT` und `MULTI_SELECT` sind ein häufiges Beispiel.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Verfügbare Trigger-Typen:
* **httpRoute**: Stellt Ihre Funktion unter einem HTTP-Pfad und einer Methode **unter dem Endpunkt `/s/`** bereit:
> z. B. `path: '/post-card/create'` ist unter `https://your-twenty-server.com/s/post-card/create` aufrufbar
<Note>
Um eine routenausgelöste Logikfunktion von einer (headless) Front-Komponente aus aufzurufen, siehe [Aufrufen einer Logikfunktion](/l/de/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
* **cron**: Führt Ihre Funktion nach Zeitplan mithilfe eines CRON-Ausdrucks aus.
* **databaseEvent**: Wird bei Lebenszyklusereignissen von Workspace-Objekten ausgeführt. Wenn die Ereignisoperation `updated` ist, können bestimmte zu überwachende Felder im Array `updatedFields` angegeben werden. Wenn das Array undefiniert oder leer ist, löst jede Aktualisierung die Funktion aus.
> z. B. `person.updated`, `*.created`, `company.*`
@@ -101,6 +101,10 @@ Machen Sie ein Feld einzigartig, um sicherzustellen, dass sich keine verschieden
Wenn beim Einstellen der Einzigartigkeit ein Fehler auftritt, überprüfen Sie auf doppelte Werte in Ihren Daten (einschließlich gelöschter Datensätze).
## Indizes (Erweitert)
Datenbankindizes werden automatisch verwaltet eigene hinzuzufügen ist selten erforderlich und kann leicht schiefgehen. Wenn der Erweiterte Modus aktiviert ist, hat jedes Objekt unter `Einstellungen → Datenmodell → <object>` einen Abschnitt **Indizes** für die Fälle, in denen du weißt, dass du einen brauchst.
## Beste Praktiken zur Feldkonfiguration
### Benennungskonventionen und Einschränkungen
@@ -43,6 +43,8 @@ export default defineField({
* A localização do arquivo fica a seu critério. A convenção é `src/fields/\<name>.field.ts`, mas o SDK detecta campos em qualquer lugar dentro de `src/`.
* Para adicionar uma aba a um layout de página padrão (por exemplo, a página de detalhes de Task ou Company), use [`definePageLayoutTab`](/l/pt/developers/extend/apps/layout/page-layouts#definepagelayouttab) com `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` de `twenty-sdk/define`.
## Adicionando uma relação a um objeto existente
Para adicionar um campo de relação (por exemplo, vinculando seu objeto personalizado a um `Person` padrão), use `defineField()` com `FieldType.RELATION`. O padrão é o mesmo que para relações inline, mas com `objectUniversalIdentifier` definido explicitamente. Veja [Relações](/l/pt/developers/extend/apps/data/relations) para o padrão bidirecional.
@@ -44,8 +44,53 @@ A **camada de dados** de um app Twenty é o conjunto de dados que seu app *adici
| **Objeto** | Um novo tipo de registro personalizado (por exemplo, PostCard, Invoice) com seus próprios campos | `defineObject()` |
| **Campo** | Uma coluna em um objeto. Campos independentes podem estender objetos que você não criou (por exemplo, adicionar `loyaltyTier` ao objeto Company) | `defineField()` |
| **Relação** | Um vínculo bidirecional entre dois objetos — ambos os lados declarados como campos | `defineField()` com `FieldType.RELATION` |
| **Índice** | Um índice de banco de dados para acelerar uma consulta recorrente em um dos seus objetos | `defineIndex()` |
O SDK detecta esses elementos por meio de análise de AST em tempo de build, então a organização dos arquivos fica a seu critério — a convenção é `src/objects/` e `src/fields/`. UUIDs `universalIdentifier` estáveis conectam tudo em implantações diferentes.
O SDK detecta esses elementos por meio de análise de AST em tempo de build, então a organização dos arquivos fica a seu critério — a convenção é `src/objects/`, `src/fields/` e `src/indexes/`. UUIDs `universalIdentifier` estáveis conectam tudo em implantações diferentes.
## Índices (Opcional)
Os apps podem incluir índices junto com seus objetos para manter rápidas as consultas recorrentes. O caso mais comum é uma coluna de status ou de chave estrangeira que você lê com frequência.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Índices únicos
`defineIndex` aceita `isUnique: true` tanto para unicidade de uma única coluna quanto de múltiplas colunas. Este é o recurso recomendado — `defineField({ isUnique: true })` está obsoleto e será removido em uma versão futura.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Outras restrições
* Cláusulas `WHERE` parciais permanecem sob controle do administrador — os apps não podem declará-las.
* Cada objeto é limitado a 10 índices personalizados (os índices do próprio framework não contam).
Ordene o array `fields` da forma como o Postgres deve usá-lo — coluna mais à esquerda primeiro, como em uma lista telefônica. Índices não são gratuitos: cada gravação na tabela os atualiza. Adicione um apenas quando você tiver uma consulta que precise dele.
<Note>
Procurando por **Application Config** ou **Roles & Permissions**? Esses descrevem o próprio app em vez dos dados que ele adiciona — eles ficam em [Config](/l/pt/developers/extend/apps/config/overview). Procurando por **Connections** (Linear, GitHub, Slack OAuth)? Essas existem para serem chamadas *a partir de* funções de lógica e ficam em [Logic](/l/pt/developers/extend/apps/logic/connections).
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` já implica uma seleção não vazia — use `numberOfSelectedRecords` apenas para contagens específicas (por exemplo, `>= 2`).
</Note>
### Variáveis de contexto
Elas representam o estado atual da página:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Chamando uma função lógica
Os componentes de front são executados no navegador em um Web Worker isolado, enquanto as [funções lógicas](/l/pt/developers/extend/apps/logic/logic-functions) são executadas no servidor. Não há chamada direta no mesmo processo entre os dois — em vez disso, um componente de front acessa uma função lógica via HTTP.
Uma função lógica declarada com `httpRouteTriggerSettings` é exposta sob o endpoint `/s/` em `${TWENTY_API_URL}/s\<path>`. Seu componente de front chama essa rota com `fetch`, autenticando com o `TWENTY_APP_ACCESS_TOKEN` que Twenty injeta no worker.
Um pequeno helper reutilizável mantém os locais de chamada limpos:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
Um componente de front headless pode executar a chamada ao montar via o componente `Command` e, em seguida, desmontar automaticamente:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
O `path` passado para `callAppRoute` deve corresponder ao `httpRouteTriggerSettings.path` da função lógica (o prefixo `/s` é adicionado pelo helper):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` e `TWENTY_APP_ACCESS_TOKEN` são injetados automaticamente — consulte [Variáveis de aplicação](#application-variables). Como as variáveis de aplicação secretas nunca são expostas aos componentes de front, mantenha as chaves de API e outra lógica sensível na função lógica, não no componente de front.
</Note>
## Acessando o contexto de execução
Dentro do seu componente, use hooks do SDK para acessar o usuário atual, o registro e a instância do componente:
@@ -65,16 +65,15 @@ Use isto quando você quiser apenas **adicionar** uma aba a um layout existente
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### Pontos-chave
* `pageLayoutUniversalIdentifier` é **obrigatório** e deve apontar para um layout de página que já exista no momento da instalação — seja um layout padrão da Twenty ou um definido pelo seu próprio aplicativo. Referências entre aplicativos para layouts pertencentes a outro aplicativo instalado não são compatíveis atualmente. Quando o layout pai estiver ausente, a instalação falha com um erro de validação claro.
* Para layouts padrão do Twenty, importe identificadores de `twenty-sdk/define`:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Cada entrada de layout também expõe suas `tabs` e seus `widgets`, para que você possa fazer referência a qualquer nível:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
Um alias abreviado `STANDARD_PAGE_LAYOUT` também está disponível:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` têm escopo apenas para esta aba — eles referenciam [front components](/l/pt/developers/extend/apps/layout/front-components), visualizações etc., exatamente como widgets definidos inline em `definePageLayout`.
* `position` controla a ordenação em relação às abas existentes no layout de destino. Escolha um valor que posicione sua aba onde você deseja em relação às abas nativas.
* Use isto em vez de `definePageLayout` quando você quiser apenas adicionar a um layout existente. Use `definePageLayout` quando você possuir todo o layout.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Tipos de campos com nomes semelhantes podem usar operandos completamente diferentes — `SELECT` e `MULTI_SELECT` sendo um caso comum.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Tipos de gatilho disponíveis:
* **httpRoute**: Expõe sua função em um caminho e método HTTP **no endpoint `/s/`**:
> por exemplo, `path: '/post-card/create'` é acessível em `https://your-twenty-server.com/s/post-card/create`
<Note>
Para invocar uma função de lógica acionada por rota a partir de um componente de front-end (headless), consulte [Chamando uma função de lógica](/l/pt/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
* **cron**: Executa sua função em um agendamento usando uma expressão CRON.
* **databaseEvent**: Executa em eventos do ciclo de vida de objetos do espaço de trabalho. Quando a operação do evento é `updated`, campos específicos a serem observados podem ser especificados no array `updatedFields`. Se deixar indefinido ou vazio, qualquer atualização acionará a função.
> por exemplo, `person.updated`, `*.created`, `company.*`
@@ -101,6 +101,10 @@ Torne um campo único para garantir que registros distintos não possam ter o me
Se você receber um erro ao definir exclusividade, verifique se há valores duplicados nos seus dados (incluindo registros excluídos).
## Índices (Avançado)
Os índices do banco de dados são gerenciados automaticamente — adicionar os seus próprios raramente é necessário e é fácil cometer erros. Com o modo Avançado ativado, cada objeto tem uma seção **Índices** em `Settings → Data Model → <object>` para os casos em que você sabe que precisa de um índice.
## Melhores Práticas de Configuração de Campos
### Convenções de Nomeação e Limitações
@@ -43,6 +43,8 @@ export default defineField({
* Locația fișierului depinde de dumneavoastră. Convenția este `src/fields/\<name>.field.ts`, dar SDK-ul detectează câmpuri oriunde în `src/`.
* Pentru a adăuga o filă într-un layout standard de pagină (de ex. pagina de detalii pentru Task sau Company), folosește [`definePageLayoutTab`](/l/ro/developers/extend/apps/layout/page-layouts#definepagelayouttab) cu `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` din `twenty-sdk/define`.
## Adăugarea unei relații la un obiect existent
Pentru a adăuga un câmp de tip relație (de ex. pentru a lega obiectul personalizat de un `Person` standard), folosiți `defineField()` cu `FieldType.RELATION`. Modelul este același ca pentru relațiile inline, dar cu `objectUniversalIdentifier` setat explicit. Consultați [Relații](/l/ro/developers/extend/apps/data/relations) pentru modelul bidirecțional.
@@ -44,8 +44,53 @@ Stratul de **date** al unei aplicații Twenty reprezintă datele pe care aplica
| **Obiect** | Un nou tip de înregistrare personalizat (de ex. PostCard, Invoice) cu propriile sale câmpuri | `defineObject()` |
| **Câmp** | O coloană pe un obiect. Câmpurile independente pot extinde obiecte pe care nu le-ați creat (de ex. adăugați `loyaltyTier` la Company) | `defineField()` |
| **Relație** | O legătură bidirecțională între două obiecte — ambele părți declarate ca câmpuri | `defineField()` cu `FieldType.RELATION` |
| **Indice** | Un indice de bază de date pentru a accelera o interogare recurentă asupra unuia dintre obiectele tale | `defineIndex()` |
SDK-ul detectează acestea prin analiza AST la momentul build-ului, astfel încât organizarea fișierelor ține de dumneavoastră — convenția este `src/objects/` și `src/fields/`. UUID-urile stabile `universalIdentifier` leagă totul în toate implementările.
SDK-ul detectează acestea prin analiza AST la momentul build-ului, astfel încât organizarea fișierelor ține de tine — convenția este `src/objects/`, `src/fields/` și `src/indexes/`. UUID-urile stabile `universalIdentifier` leagă totul în toate implementările.
## Indici (opțional)
Aplicațiile pot livra indici împreună cu obiectele lor pentru a menține rapide interogările recurente. Cel mai comun caz este o coloană de status sau o coloană cu cheie străină pe care o citești frecvent.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Indici unici
`defineIndex` acceptă `isUnique: true` atât pentru unicitatea pe o singură coloană, cât și pe mai multe coloane. Aceasta este primitiva recomandată — `defineField({ isUnique: true })` este învechită (deprecated) și va fi eliminată într-o versiune viitoare.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Alte constrângeri
* Clauzele `WHERE` parțiale rămân sub controlul administratorului — aplicațiile nu le pot declara.
* Fiecare obiect este limitat la 10 indici personalizați (indicii proprii ai framework-ului nu se pun la socoteală).
Ordonează array-ul `fields` în modul în care Postgres ar trebui să îl folosească — coloana din stânga prima, ca într-o agendă telefonică. Indicii nu sunt gratuiți: fiecare scriere în tabel îi actualizează. Adaugă unul doar atunci când ai o interogare care are nevoie de el.
<Note>
Căutați **Application Config** sau **Roles & Permissions**? Acestea descriu aplicația în sine, mai degrabă decât datele pe care le adaugă — se află la [Config](/l/ro/developers/extend/apps/config/overview). Căutați **Connections** (Linear, GitHub, Slack OAuth)? Acestea există pentru a fi apelate *din* funcții de logică și se află la [Logic](/l/ro/developers/extend/apps/logic/connections).
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` implică deja o selecție care nu este goală — folosește `numberOfSelectedRecords` doar pentru valori specifice (de ex. `>= 2`).
</Note>
### Variabile de context
Acestea reprezintă starea curentă a paginii:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Apelarea unei funcții logice
Componentele de front rulează în browser într-un Web Worker izolat, în timp ce [funcțiile logice](/l/ro/developers/extend/apps/logic/logic-functions) rulează pe server. Nu există un apel direct în același proces între cele două — în schimb, o componentă de front apelează o funcție logică prin HTTP.
O funcție logică declarată cu `httpRouteTriggerSettings` este expusă sub endpoint-ul `/s/` la `${TWENTY_API_URL}/s\<path>`. Componenta ta de front apelează acea rută cu `fetch`, autentificându-se cu `TWENTY_APP_ACCESS_TOKEN` pe care Twenty îl injectează în worker.
Un mic utilitar reutilizabil menține locurile de apel curate:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
O componentă de front headless poate efectua apelul la montare prin componenta `Command`, apoi se demontează automat:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
`path` transmis către `callAppRoute` trebuie să corespundă cu `httpRouteTriggerSettings.path` al funcției logice (prefixul `/s` este adăugat de utilitar):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` și `TWENTY_APP_ACCESS_TOKEN` sunt injectate automat — vezi [Application variables](#application-variables). Deoarece variabilele de aplicație secrete nu sunt niciodată expuse componentelor de front, păstrează cheile API și altă logică sensibilă în funcția logică, nu în componenta de front.
</Note>
## Accesarea contextului de rulare
În interiorul componentei, folosiți hook-urile SDK pentru a accesa utilizatorul curent, înregistrarea curentă și instanța componentei:
@@ -65,16 +65,15 @@ Folosește aceasta atunci când vrei doar să **adaugi** o filă la un layout ex
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### Puncte cheie
* `pageLayoutUniversalIdentifier` este **obligatoriu** și trebuie să indice către un layout de pagină care există deja la momentul instalării — fie un layout standard Twenty, fie unul definit de propria ta aplicație. Referințele cross-app către layouturi deținute de o altă aplicație instalată nu sunt acceptate în prezent. Când lipsește layoutul părinte, instalarea eșuează cu o eroare clară de validare.
* Pentru layout-urile standard Twenty, importați identificatorii din `twenty-sdk/define`:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Fiecare intrare de layout își expune, de asemenea, `tabs` și `widgets`, astfel încât puteți face referire la orice nivel:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
Este disponibil și un alias scurt `STANDARD_PAGE_LAYOUT`:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` sunt limitate doar la această filă — fac referire la [front components](/l/ro/developers/extend/apps/layout/front-components), vizualizări etc., exact ca widgeturile definite inline în `definePageLayout`.
* `position` controlează ordonarea în raport cu filele existente din layoutul țintă. Alege o valoare care să plaseze fila ta acolo unde dorești, relativ la filele predefinite.
* Folosește aceasta în loc de `definePageLayout` atunci când vrei doar să adaugi la un layout existent. Folosește `definePageLayout` atunci când deții întregul layout.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Tipurile de câmp cu nume similare pot folosi operanzi complet diferiți — `SELECT` și `MULTI_SELECT` fiind un caz comun.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Tipuri de declanșatoare disponibile:
* **httpRoute**: Expune funcția pe o cale și metodă HTTP **sub endpoint-ul `/s/`**:
> de ex. `path: '/post-card/create'` este apelabil la `https://your-twenty-server.com/s/post-card/create`
<Note>
Pentru a apela o funcție logică declanșată de o rută dintr-o componentă front-end (headless), consultă [Apelarea unei funcții logice](/l/ro/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
* **cron**: Rulează funcția pe un program folosind o expresie CRON.
* **databaseEvent**: Rulează la evenimentele ciclului de viață ale obiectelor din spațiul de lucru. Când operațiunea evenimentului este `updated`, câmpurile specifice de urmărit pot fi specificate în array-ul `updatedFields`. Dacă este lăsat nedefinit sau gol, orice actualizare va declanșa funcția.
> de ex. `person.updated`, `*.created`, `company.*`
@@ -101,6 +101,10 @@ Faceți un câmp unic pentru a vă asigura că înregistrările distincte nu pot
Dacă primiți o eroare când setați unicitatea, verificați prezența valorilor duplicate în datele dumneavoastră (inclusiv în cele șterse).
## Indexuri (Avansat)
Indexurile bazei de date sunt gestionate automat — adăugarea unor indexuri proprii este rareori necesară și se greșește ușor. Cu modul Avansat activat, fiecare obiect are o secțiune **Indexuri** sub `Settings → Data Model → <object>` pentru cazurile în care știi că ai nevoie de unul.
## Cele mai bune practici pentru configurarea câmpurilor
### Convenții de denumire și limitări
@@ -43,6 +43,8 @@ export default defineField({
* Расположение файла зависит от вас. Принятое соглашение — `src/fields/\<name>.field.ts`, но SDK обнаруживает поля в любом месте внутри `src/`.
* Чтобы добавить вкладку в стандартную компоновку страницы (например, на страницу сведений о задаче или компании), используйте [`definePageLayoutTab`](/l/ru/developers/extend/apps/layout/page-layouts#definepagelayouttab) с `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` из `twenty-sdk/define`.
## Добавление связи к существующему объекту
Чтобы добавить поле связи (например, связать ваш пользовательский объект со стандартным `Person`), используйте `defineField()` с `FieldType.RELATION`. Шаблон тот же, что и для встроенных связей, но с явным указанием `objectUniversalIdentifier`. Смотрите раздел [Relations](/l/ru/developers/extend/apps/data/relations) для двунаправленного шаблона.
@@ -44,8 +44,53 @@ icon: database
| **Объект** | Новый пользовательский тип записей (например, PostCard, Invoice) с собственными полями | `defineObject()` |
| **Поле** | Столбец в объекте. Отдельные поля могут расширять объекты, которые вы не создавали (например, добавьте `loyaltyTier` к объекту Company) | `defineField()` |
| **Связь** | Двусторонняя связь между двумя объектами — обе стороны объявлены как поля | `defineField()` с `FieldType.RELATION` |
| **Индекс** | Индекс базы данных для ускорения повторяющегося запроса к одному из ваших объектов | `defineIndex()` |
SDK обнаруживает их с помощью анализа AST во время сборки, поэтому организация файлов остается на ваше усмотрение — по соглашению используются `src/objects/` и `src/fields/`. Стабильные UUID `universalIdentifier` связывают все воедино между развертываниями.
SDK обнаруживает их с помощью анализа AST во время сборки, поэтому организация файлов остается на ваше усмотрение — по соглашению используются `src/objects/`, `src/fields/` и `src/indexes/`. Стабильные UUID `universalIdentifier` связывают все воедино между развертываниями.
## Индексы (необязательно)
Приложения могут поставлять индексы вместе со своими объектами, чтобы повторяющиеся запросы выполнялись быстро. Наиболее распространенный случай — столбец статуса или внешнего ключа, к которому вы часто обращаетесь при чтении.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Уникальные индексы
`defineIndex` принимает `isUnique: true` как для уникальности по одному столбцу, так и по нескольким столбцам. Это рекомендуемый примитив — `defineField({ isUnique: true })` устарел и будет удален в одном из будущих релизов.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Другие ограничения
* Частичные предложения `WHERE` остаются под контролем администратора — приложения не могут объявлять их.
* Для каждого объекта допускается не более 10 пользовательских индексов (индексы самого фреймворка не учитываются).
Упорядочьте массив `fields` в том порядке, в котором Postgres должен его использовать — сначала самый левый столбец, как в телефонной книге. Индексы не бесплатны: при каждой записи в таблицу они обновляются. Добавляйте индекс только тогда, когда у вас есть запрос, которому он действительно нужен.
<Note>
Ищете **Application Config** или **Roles & Permissions**? Они описывают само приложение, а не данные, которые оно добавляет, — их можно найти в разделе [Config](/l/ru/developers/extend/apps/config/overview). Ищете **Connections** (Linear, GitHub, Slack OAuth)? Они существуют для вызова *из* логических функций и находятся в разделе [Logic](/l/ru/developers/extend/apps/logic/connections).
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` уже подразумевает, что есть выбранные записи — используйте `numberOfSelectedRecords` только для конкретных количеств (например, `>= 2`).
</Note>
### Переменные контекста
Они представляют текущее состояние страницы:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Вызов логической функции
Front-компоненты выполняются в браузере в изолированном Web Worker, в то время как [логические функции](/l/ru/developers/extend/apps/logic/logic-functions) выполняются на стороне сервера. Между ними нет прямого внутрипроцессного вызова — вместо этого front-компонент обращается к логической функции по HTTP.
Логическая функция, объявленная с `httpRouteTriggerSettings`, доступна по эндпоинту `/s/` по адресу `${TWENTY_API_URL}/s\<path>`. Ваш front-компонент вызывает этот маршрут с помощью `fetch`, аутентифицируясь с использованием `TWENTY_APP_ACCESS_TOKEN`, который Twenty внедряет в worker.
Небольшой переиспользуемый хелпер делает места вызова чище:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
Безголовый front-компонент может выполнить вызов при монтировании через компонент `Command`, а затем автоматически размонтироваться:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
`path`, переданный в `callAppRoute`, должен совпадать с `httpRouteTriggerSettings.path` логической функции (префикс `/s` добавляется хелпером):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` и `TWENTY_APP_ACCESS_TOKEN` внедряются автоматически — см. [переменные приложения](#application-variables). Поскольку секретные переменные приложения никогда не раскрываются front-компонентам, храните ключи API и другую конфиденциальную логику в логической функции, а не во front-компоненте.
</Note>
## Доступ к контексту времени выполнения
Внутри вашего компонента используйте хуки SDK для доступа к текущему пользователю, записи и экземпляру компонента:
@@ -65,16 +65,15 @@ export default definePageLayout({
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### Основные моменты
* `pageLayoutUniversalIdentifier` является **обязательным** и должен указывать на макет страницы, который уже существует на момент установки — либо стандартный макет Twenty, либо определённый вашим собственным приложением. Кросс-приложенческие ссылки на макеты, которыми владеет другое установленное приложение, на данный момент не поддерживаются. Если родительский макет отсутствует, установка завершается с понятной ошибкой проверки.
* Для стандартных макетов Twenty импортируйте идентификаторы из `twenty-sdk/define`:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Каждый элемент макета также предоставляет свои `tabs` и их `widgets`, поэтому вы можете ссылаться на любой уровень:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
Также доступен короткий псевдоним `STANDARD_PAGE_LAYOUT`:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` ограничены только этой вкладкой — они ссылаются на [front components](/l/ru/developers/extend/apps/layout/front-components), представления и т. п. точно так же, как виджеты, определённые непосредственно в `definePageLayout`.
* `position` управляет порядком относительно существующих вкладок в целевом макете. Выберите значение, которое поместит вашу вкладку в нужное место относительно встроенных вкладок.
* Используйте это вместо `definePageLayout`, когда вы хотите только добавить к существующему макету. Используйте `definePageLayout`, когда вы управляете всем макетом.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Типы полей с похожими названиями могут использовать совершенно разные операнды — типичный пример: `SELECT` и `MULTI_SELECT`.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Доступные типы триггеров:
* **httpRoute**: Публикует вашу функцию по HTTP-пути и методу **под конечной точкой `/s/`**:
> например, `path: '/post-card/create'` вызывается по адресу `https://your-twenty-server.com/s/post-card/create`
<Note>
Чтобы вызвать логическую функцию, запускаемую маршрутом, из фронтенд-компонента (без интерфейса), см. раздел [Вызов логической функции](/l/ru/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
* **cron**: Запускает вашу функцию по расписанию с использованием выражения CRON.
* **databaseEvent**: Запускается при событиях жизненного цикла объектов рабочего пространства. Когда операция события — `updated`, можно указать конкретные поля для отслеживания в массиве `updatedFields`. Если оставить не заданным или пустым, любое обновление будет вызывать функцию.
> например, `person.updated`, `*.created`, `company.*`
@@ -101,6 +101,10 @@ Twenty поддерживает различные типы полей:
Если вы получаете ошибку при установке уникальности, проверьте дублирующиеся значения в ваших данных (включая удаленные записи).
## Индексы (расширенный режим)
Индексы базы данных управляются автоматически — добавлять собственные почти никогда не требуется и при этом легко допустить ошибку. При включенном расширенном режиме у каждого объекта есть раздел **Индексы** в `Settings → Data Model → <object>` для случаев, когда вы знаете, что вам нужен индекс.
## Лучшие практики в настройке полей
### Именование и ограничения
@@ -43,6 +43,8 @@ export default defineField({
* Dosya konumu size bağlıdır. Genel kabul gören yapı `src/fields/\<name>.field.ts` şeklindedir, ancak SDK `src/` içinde herhangi bir yerdeki alanları algılar.
* Standart bir sayfa yerleşimine (örneğin, Görev veya Şirket detay sayfası) bir sekme eklemek için, `twenty-sdk/define` içindeki `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS` ile birlikte [`definePageLayoutTab`](/l/tr/developers/extend/apps/layout/page-layouts#definepagelayouttab) kullanın.
## Mevcut bir nesneye ilişki ekleme
Bir ilişki alanı eklemek için (örneğin özel nesnenizi standart bir `Person` nesnesine bağlamak), `FieldType.RELATION` ile `defineField()` kullanın. Desen, satır içi ilişkilerle aynıdır ancak `objectUniversalIdentifier` açıkça ayarlanır. Çift yönlü desen için [Relations](/l/tr/developers/extend/apps/data/relations) bölümüne bakın.
@@ -44,8 +44,53 @@ Bir Twenty uygulamasının **veri katmanı**, uygulamanızın bir çalışma ala
| **Nesne** | Kendi alanlarına sahip yeni bir özel kayıt türü (ör. PostCard, Invoice) | `defineObject()` |
| **Alan** | Bir nesne üzerindeki sütun. Bağımsız alanlar, oluşturmadığınız nesneleri genişletebilir (ör. Company nesnesine `loyaltyTier` ekleyin) | `defineField()` |
| **İlişki** | İki nesne arasında, her iki tarafı da alan olarak bildirilmiş çift yönlü bir bağlantı | `defineField()` ile `FieldType.RELATION` |
| **Dizin** | Nesnelerinizden biri üzerinde yinelenen bir sorguyu hızlandırmak için bir veritabanı dizini | `defineIndex()` |
SDK bunları derleme zamanında AST analiziyle algılar, bu yüzden dosya organizasyonu size kalmıştır — kullanılan gelenek `src/objects/` ve `src/fields/` dizinleridir. Kararlı `universalIdentifier` UUIDleri, dağıtımlar arasında her şeyi birbirine bağlar.
SDK bunları derleme zamanında AST analiziyle algılar, bu yüzden dosya organizasyonu size kalmıştır — kullanılan gelenek `src/objects/`, `src/fields/` ve `src/indexes/` dizinleridir. Kararlı `universalIdentifier` UUIDleri, dağıtımlar arasında her şeyi birbirine bağlar.
## Dizinler (İsteğe bağlı)
Uygulamalar, yinelenen sorguları hızlı tutmak için nesneleriyle birlikte dizinler sunabilir. En yaygın durum, sık okuduğunuz bir durum ya da yabancı anahtar sütunudur.
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### Benzersiz dizinler
`defineIndex`, hem tek sütunlu hem çok sütunlu benzersizlik için `isUnique: true` kabul eder. Önerilen yöntem budur — `defineField({ isUnique: true })` kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### Diğer kısıtlamalar
* Kısmi `WHERE` koşulları yönetici kontrolü altında kalır — uygulamalar bunları tanımlayamaz.
* Her nesne, 10 özel dizin ile sınırlandırılmıştır (framework'ün kendi dizinleri buna dahil değildir).
`fields` dizisini, Postgres'in kullanması gereken şekilde sıralayın — en soldaki sütun ilk, bir telefon rehberinde olduğu gibi. Dizinler bedava değildir: tabloya yapılan her yazma işlemi bunları günceller. Bir dizini yalnızca ona ihtiyaç duyan bir sorgunuz olduğunda ekleyin.
<Note>
**Application Config** veya **Roles & Permissions** mı arıyorsunuz? Bunlar, ekledikleri verilerden çok uygulamanın kendisini tanımlar — [Config](/l/tr/developers/extend/apps/config/overview) altında bulunurlar. **Connections** (Linear, GitHub, Slack OAuth) mı arıyorsunuz? Bunlar, mantık fonksiyonları *içinden* çağrılmak için vardır ve [Logic](/l/tr/developers/extend/apps/logic/connections) altında bulunurlar.
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` zaten boş olmayan bir seçim anlamına gelir — `numberOfSelectedRecords` ifadesini yalnızca belirli sayılar için kullanın (örneğin `>= 2`).
</Note>
### Bağlam değişkenleri
Bunlar sayfanın mevcut durumunu temsil eder:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## Bir mantık işlevini çağırma
Ön bileşenler, tarayıcı tarafında izole bir Web Worker içinde çalışırken, [mantık işlevleri](/l/tr/developers/extend/apps/logic/logic-functions) sunucu tarafında çalışır. İkisi arasında doğrudan, işlem içi bir çağrı yoktur — bunun yerine, bir ön bileşen bir mantık işlevine HTTP üzerinden erişir.
`httpRouteTriggerSettings` ile bildirilen bir mantık işlevi, `${TWENTY_API_URL}/s\<path>` altındaki `/s/` uç noktasında sunulur. Ön bileşeniniz bu rotayı, Twenty tarafından Worker'a enjekte edilen `TWENTY_APP_ACCESS_TOKEN` ile kimlik doğrulayarak `fetch` ile çağırır.
Küçük, yeniden kullanılabilir bir yardımcı işlev çağrı noktalarını sade tutar:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
Başsız bir ön bileşen, çağrıyı `Command` bileşeni aracılığıyla mount sırasında çalıştırabilir ve ardından otomatik olarak unmount olabilir:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
`callAppRoute` fonksiyonuna geçirilen `path`, mantık işlevinin `httpRouteTriggerSettings.path` değeriyle eşleşmelidir (`/s` öneki yardımcı işlev tarafından eklenir):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` ve `TWENTY_APP_ACCESS_TOKEN` otomatik olarak enjekte edilir — bkz. [Uygulama değişkenleri](#application-variables). Gizli uygulama değişkenleri asla ön bileşenlere açığa çıkarılmadığından, API anahtarlarını ve diğer hassas mantığı ön bileşende değil, mantık işlevinin içinde tutun.
</Note>
## Çalışma zamanı bağlamına erişme
Bileşeninizin içinde, geçerli kullanıcıya, kayda ve bileşen örneğine erişmek için SDK hook'larını kullanın:
@@ -65,16 +65,15 @@ Bunu yalnızca mevcut bir düzene **sekme eklemek** istediğinizde kullanın —
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### Önemli noktalar
* `pageLayoutUniversalIdentifier` **zorunludur** ve kurulum anında zaten var olan bir sayfa düzenini işaret etmelidir — standart bir Twenty düzeni veya kendi uygulamanız tarafından tanımlanan bir düzen olabilir. Başka yüklü bir uygulamaya ait düzenlere uygulamalar arası referanslar bugün desteklenmemektedir. Üst düzen eksik olduğunda, kurulum net bir doğrulama hatasıyla başarısız olur.
* Standart Twenty yerleşimleri için tanımlayıcıları `twenty-sdk/define` içinden içe aktarın:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
Her yerleşim girdisi ayrıca `tabs` ve bunların `widgets` ögelerini de açığa çıkarır, böylece herhangi bir düzeye başvurabilirsiniz:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
Kısa bir takma ad `STANDARD_PAGE_LAYOUT` da kullanılabilir:
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` yalnızca bu sekmeyle sınırlıdır — satır içi olarak `definePageLayout` içinde tanımlanan widget'larda olduğu gibi, [ön uç bileşenlerine](/l/tr/developers/extend/apps/layout/front-components), görünümlere vb. tam olarak aynı şekilde referans verirler.
* `position`, hedeflenen düzende mevcut sekmelere göre sıralamayı kontrol eder. Yerleşik sekmelere göre sekmenizi istediğiniz konuma yerleştirecek bir değer seçin.
* Yalnızca mevcut bir düzene ekleme yapmak istediğinizde `definePageLayout` yerine bunu kullanın. Tüm düzene sahip olduğunuzda `definePageLayout` kullanın.
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> Benzer adlara sahip alan türleri tamamen farklı işleçler kullanabilir — buna `SELECT` ve `MULTI_SELECT` yaygın bir örnektir.
@@ -53,6 +53,10 @@ export default defineLogicFunction({
Kullanılabilir tetikleyici türleri:
* **httpRoute**: İşlevinizi bir HTTP yolu ve yöntemiyle **`/s/` uç noktasının altında** kullanıma sunar:
> örn. `path: '/post-card/create'` `https://your-twenty-server.com/s/post-card/create` adresinden çağrılabilir
<Note>
Arayüzsüz bir ön uç bileşeninden rota tarafından tetiklenen mantık fonksiyonunu çağırmak için bkz. [Mantık fonksiyonu çağırma](/l/tr/developers/extend/apps/layout/front-components#calling-a-logic-function).
</Note>
* **cron**: Bir CRON ifadesi kullanarak işlevinizi bir zamanlamayla çalıştırır.
* **databaseEvent**: Çalışma alanı nesnesi yaşam döngüsü olaylarında çalışır. Olay işlemi `updated` olduğunda, dinlenecek belirli alanlar `updatedFields` dizisinde belirtilebilir. Tanımsız veya boş bırakılırsa, herhangi bir güncelleme işlevi tetikler.
> örn. `person.updated`, `*.created`, `company.*`
@@ -101,6 +101,10 @@ Farklı kayıtların aynı değere sahip olamaması için bir alanı benzersiz y
Benzersizliği ayarlarken bir hata alırsanız, verilerinizde (silinen kayıtlar dahil) yinelenen değerleri kontrol edin.
## Dizinler (Gelişmiş)
Veritabanı dizinleri otomatik olarak yönetilir — kendi dizinlerinizi eklemeniz nadiren gereklidir ve yanlış yapmak da kolaydır. Gelişmiş mod açıkken, bir dizine ihtiyacınız olduğunu bildiğiniz durumlar için her nesnenin `Ayarlar → Veri Modeli → <object>` altında bir **Dizinler** bölümü bulunur.
## Alan Yapılandırma En İyi Uygulamaları
### Adlandırma Kuralları ve Kısıtlamaları
@@ -43,6 +43,8 @@ export default defineField({
* 文件位置由你决定。 约定是使用 `src/fields/\<name>.field.ts`,但 SDK 会在整个 `src/` 中检测字段。
* 要在标准页面布局(例如任务或公司详情页面)中添加一个选项卡,请使用 [`definePageLayoutTab`](/l/zh/developers/extend/apps/layout/page-layouts#definepagelayouttab),并结合来自 `twenty-sdk/define` 的 `STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS`。
## 向现有对象添加关系
要添加关系字段(例如将你的自定义对象链接到标准 `Person`),请将 `defineField()` 与 `FieldType.RELATION` 一起使用。 模式与内联关系相同,但需要显式设置 `objectUniversalIdentifier`。 有关双向模式,请参见[关系](/l/zh/developers/extend/apps/data/relations)。
@@ -44,8 +44,53 @@ Twenty 应用的 **数据层(data layer)** 是你的应用*添加*到工作
| **对象** | 具有自有字段的新自定义记录类型(例如 PostCard、Invoice | `defineObject()` |
| **字段** | 对象上的一列。 独立字段可以扩展你未创建的对象(例如向 Company 添加 `loyaltyTier` | `defineField()` |
| **关系** | 两个对象之间的双向链接——双方都声明为字段 | 使用 `defineField()` 并指定 `FieldType.RELATION` |
| **索引** | 用于加速在某个对象上经常执行的查询的数据库索引 | `defineIndex()` |
SDK 会在构建时通过 AST 分析检测这些内容,因此文件组织方式由你决定——约定是使用 `src/objects/` 和 `src/fields/`。 稳定的 `universalIdentifier` UUID 在不同部署之间将一切关联在一起。
SDK 会在构建时通过 AST 分析检测这些内容,因此文件组织方式由你决定——约定是使用 `src/objects/`、`src/fields/` 和 `src/indexes/`。 稳定的 `universalIdentifier` UUID 在不同部署之间将一切关联在一起。
## 索引(可选)
应用可以随对象一同提供索引,以确保经常执行的查询保持快速。 最常见的情况是某个你经常读取的状态列或外键列。
```ts src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';
import {
POST_CARD_UNIVERSAL_IDENTIFIER,
STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';
export default defineIndex({
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
fields: [
{
universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
},
],
});
```
### 唯一索引
`defineIndex` 接受 `isUnique: true`,可同时用于单列和多列表达唯一性约束。 这是推荐的基础方式——`defineField({ isUnique: true })` 已被弃用,并将在未来的版本中移除。
```ts
defineIndex({
universalIdentifier: '…',
objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
isUnique: true,
fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});
```
### 其他约束
* 部分 `WHERE` 子句由管理员控制——应用无法声明它们。
* 每个对象最多只能有 10 个自定义索引(框架自身的索引不计入其中)。
按照 Postgres 使用索引的方式来排列 `fields` 数组——最左边的列放在最前面,就像电话簿一样。 索引不是免费的:对表的每一次写入都会更新索引。 只有当你确实有查询需要某个索引时才添加它。
<Note>
在找 **Application Config** 或 **Roles & Permissions** 吗? 这些描述的是应用本身而不是它添加的数据——相关内容位于 [Config](/l/zh/developers/extend/apps/config/overview) 下。 在找 **Connections**Linear、GitHub、Slack OAuth)吗? 这些用于*从*逻辑函数中调用,并位于 [Logic](/l/zh/developers/extend/apps/logic/connections) 下。
@@ -103,6 +103,10 @@ export default defineCommandMenuItem({
});
```
<Note>
`RECORD_SELECTION` 已经意味着非空选择 — 仅在需要表达具体数量时使用 `numberOfSelectedRecords`(例如 `>= 2`)。
</Note>
### 上下文变量
这些变量表示页面的当前状态:
@@ -196,6 +196,94 @@ export default defineFrontComponent({
});
```
## 调用逻辑函数
前端组件在沙盒 Web Worker 中于浏览器端运行,而[逻辑函数](/l/zh/developers/extend/apps/logic/logic-functions)在服务器端运行。 二者之间没有直接的进程内调用——前端组件通过 HTTP 访问逻辑函数。
使用 `httpRouteTriggerSettings` 声明的逻辑函数会通过 `/s/` 端点暴露在 `${TWENTY_API_URL}/s\<path>` 下。 你的前端组件使用 `fetch` 调用该路由,并使用 Twenty 注入到 worker 中的 `TWENTY_APP_ACCESS_TOKEN` 进行身份验证。
一个小型可复用的辅助函数可以让调用端保持简洁:
```ts src/shared/call-app-route.ts
export async function callAppRoute(
path: string,
body: Record<string, unknown>,
): Promise<unknown> {
const apiUrl = process.env.TWENTY_API_URL ?? '';
const token = process.env.TWENTY_APP_ACCESS_TOKEN;
const res = await fetch(`${apiUrl}/s${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`Logic function failed (${res.status})`);
}
return res.json();
}
```
无头前端组件可以通过 `Command` 组件在挂载时执行调用,然后自动卸载:
```tsx src/front-components/sync-prs.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { Command } from 'twenty-sdk/command';
import { callAppRoute } from 'src/shared/call-app-route';
const SyncPrs = () => {
const execute = async () => {
await callAppRoute('/github/fetch-prs', {
owner: 'twentyhq',
repo: 'twenty',
});
};
return <Command execute={execute} />;
};
export default defineFrontComponent({
universalIdentifier: '...',
name: 'sync-prs',
description: 'Triggers the fetch-prs logic function',
isHeadless: true,
component: SyncPrs,
});
```
传递给 `callAppRoute` 的 `path` 必须与逻辑函数的 `httpRouteTriggerSettings.path` 匹配(`/s` 前缀由辅助函数添加):
```ts src/logic-functions/fetch-prs.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import type { RoutePayload } from 'twenty-sdk/logic-function';
const handler = async (event: RoutePayload) => {
const { owner, repo } = (event.body ?? {}) as { owner: string; repo: string };
// ...fetch from GitHub and persist records...
return { ok: true };
};
export default defineLogicFunction({
universalIdentifier: '...',
name: 'fetch-prs',
handler,
httpRouteTriggerSettings: {
path: '/github/fetch-prs',
httpMethod: 'POST',
isAuthRequired: true,
},
});
```
<Note>
`TWENTY_API_URL` 和 `TWENTY_APP_ACCESS_TOKEN` 会被自动注入——参见 [应用变量](#application-variables)。 由于机密应用变量永远不会暴露给前端组件,请将 API 密钥和其他敏感逻辑保留在逻辑函数中,而不是前端组件中。
</Note>
## 访问运行时上下文
在组件内部,使用 SDK 的 hooks 获取当前用户、记录和组件实例:
@@ -65,16 +65,15 @@ export default definePageLayout({
import {
definePageLayoutTab,
PageLayoutTabLayoutMode,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world';
const COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =
'20202020-ab01-4001-8001-c0aba11c0100';
export default definePageLayoutTab({
universalIdentifier: 'b1b2b3b4-b5b6-4000-8000-000000000001',
pageLayoutUniversalIdentifier:
COMPANY_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage
.universalIdentifier,
title: 'Hello World',
position: 1000,
icon: 'IconWorld',
@@ -97,6 +96,37 @@ export default definePageLayoutTab({
### 关键点
* `pageLayoutUniversalIdentifier` 是**必需的**,并且必须在安装时指向一个已存在的页面布局——可以是标准的 Twenty 布局,也可以是由你自己的应用定义的布局。 当前不支持跨应用引用由其他已安装应用拥有的布局。 当父布局缺失时,安装会失败,并给出清晰的验证错误。
* 对于标准 Twenty 布局,从 `twenty-sdk/define` 导入标识符:
```ts
import { STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.companyRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.personRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.opportunityRecordPage.universalIdentifier
// STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.noteRecordPage.universalIdentifier
// …
```
每个布局条目还会公开其 `tabs` 及其 `widgets`,因此你可以引用任意层级:
```ts
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.universalIdentifier
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.tabs.home.widgets.fields.universalIdentifier
```
还提供了一个简短别名 `STANDARD_PAGE_LAYOUT`
```ts
import { STANDARD_PAGE_LAYOUT } from 'twenty-sdk/define';
STANDARD_PAGE_LAYOUT.companyRecordPage.universalIdentifier;
```
* `widgets` 仅作用于此选项卡——它们引用[前端组件](/l/zh/developers/extend/apps/layout/front-components)、视图等,其方式与在 `definePageLayout` 中内联定义的小部件完全相同。
* `position` 控制目标布局中相对于现有选项卡的排序。 选择一个取值,使你的选项卡相对于内置选项卡位于你想要的位置。
* 当你只想向现有布局进行添加时,请使用此功能,而不是 `definePageLayout`。 当你拥有整个布局时,请使用 `definePageLayout`。
@@ -70,7 +70,7 @@ filters: [
| `CURRENCY.currencyCode` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `DATE`, `DATE_TIME` | `IS`, `IS_RELATIVE`, `IS_IN_PAST`, `IS_IN_FUTURE`, `IS_TODAY`, `IS_BEFORE`, `IS_AFTER`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `BOOLEAN` | `IS` |
| `UUID` | `IS` |
| `UUID` | `IS`, `IS_NOT`, `IS_EMPTY`, `IS_NOT_EMPTY` |
| `TS_VECTOR` | `VECTOR_SEARCH` |
> 名称相似的字段类型可以使用完全不同的运算符 —— `SELECT` 和 `MULTI_SELECT` 就是常见情况。
@@ -53,6 +53,10 @@ export default defineLogicFunction({
可用的触发器类型:
* **httpRoute**:在 **`/s/` 端点**下通过 HTTP 路径和方法公开你的函数:
> 例如 `path: '/post-card/create'` 可在 `https://your-twenty-server.com/s/post-card/create` 调用
<Note>
要从(无头)前端组件调用由路由触发的逻辑函数,请参见[调用逻辑函数](/l/zh/developers/extend/apps/layout/front-components#calling-a-logic-function)。
</Note>
* **cron**:使用 CRON 表达式按计划运行你的函数。
* **databaseEvent**:在工作区对象生命周期事件上运行。 当事件操作为 `updated` 时,可以在 `updatedFields` 数组中指定要监听的特定字段。 如果未定义或为空,任何更新都会触发该函数。
> 例如 `person.updated`、`*.created`、`company.*`
@@ -101,6 +101,10 @@ Twenty 支持多种字段类型:
如果在设置唯一性时出现错误,请检查数据中是否有重复值(包括删除的记录)。
## 索引(高级)
数据库索引由系统自动管理——自己添加索引通常没必要,而且也很容易出错。 在开启高级模式后,每个对象在 `Settings → Data Model → <object>` 下都会有一个 **Indexes** 部分,供你在确实需要索引时使用。
## 字段配置最佳实践
### 命名约定和限制
@@ -101,6 +101,10 @@ Make a field unique to ensure distinct records cannot have the same value. For e
If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
## Indexes (Advanced)
Database indexes are managed automatically — adding your own is rarely necessary and easy to get wrong. With Advanced mode on, each object has an **Indexes** section under `Settings → Data Model → <object>` for the cases where you know you need one.
## Field Configuration Best Practices
### Naming Conventions and Limitations
@@ -36,8 +36,8 @@
"@storybook/addon-vitest": "^10.2.13",
"@storybook/react-vite": "^10.2.13",
"@types/node": "^24.0.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@types/react": "^18.2.39",
"@types/react-dom": "^18.2.15",
"@typescript/native-preview": "^7.0.0-dev.20260116.1",
"@vitest/browser-playwright": "^4.0.18",
"playwright": "^1.56.1",
@@ -0,0 +1,6 @@
import { createContext } from 'react';
export type SetEditableFocused = (focused: boolean) => void;
export const FrontComponentInputFocusContext =
createContext<SetEditableFocused | null>(null);
@@ -7,7 +7,7 @@ import {
isString,
isUndefined,
} from '@sniptt/guards';
import React from 'react';
import React, { useContext } from 'react';
import { isDefined } from 'twenty-shared/utils';
import { EVENT_TO_REACT } from '@/constants/EventToReact';
@@ -15,6 +15,10 @@ import {
type SerializedEventData,
type SerializedFileData,
} from '@/constants/SerializedEventData';
import {
FrontComponentInputFocusContext,
type SetEditableFocused,
} from '@/host/contexts/FrontComponentInputFocusContext';
const INTERNAL_PROPS = new Set(['element', 'receiver', 'components']);
@@ -352,18 +356,41 @@ const createCaretPreservingElement = (
htmlTag: 'input' | 'textarea',
reactProps: Record<string, unknown>,
forcedProps: Record<string, unknown> | undefined,
setEditableFocused: SetEditableFocused | null,
) => {
const { value, defaultValue, ...rest } = reactProps;
const {
value,
defaultValue,
onFocus: forwardedOnFocus,
onBlur: forwardedOnBlur,
...rest
} = reactProps;
const initialValue = isNonEmptyString(defaultValue)
? defaultValue
: isNonEmptyString(value)
? value
: undefined;
const handleFocus = (event: React.FocusEvent<CaretPreservingElement>) => {
setEditableFocused?.(true);
if (isFunction(forwardedOnFocus)) {
forwardedOnFocus(event);
}
};
const handleBlur = (event: React.FocusEvent<CaretPreservingElement>) => {
setEditableFocused?.(false);
if (isFunction(forwardedOnBlur)) {
forwardedOnBlur(event);
}
};
return React.createElement(htmlTag, {
...rest,
...forcedProps,
defaultValue: initialValue,
onFocus: handleFocus,
onBlur: handleBlur,
ref: (node: CaretPreservingElement | null) => {
if (!isDefined(node)) {
return;
@@ -380,13 +407,19 @@ export const createHtmlHostWrapper = (htmlTag: string) => {
const isVoid = VOID_ELEMENTS.has(htmlTag);
return ({ children, ...props }: WrapperProps) => {
const setEditableFocused = useContext(FrontComponentInputFocusContext);
const reactProps = filterProps(props);
if (
htmlTag === 'textarea' ||
(htmlTag === 'input' && isTextLikeInputType(reactProps.type))
) {
return createCaretPreservingElement(htmlTag, reactProps, forcedProps);
return createCaretPreservingElement(
htmlTag,
reactProps,
forcedProps,
setEditableFocused,
);
}
return React.createElement(
@@ -1,4 +1,8 @@
export { FrontComponentRenderer } from './host/components/FrontComponentRenderer';
export {
FrontComponentInputFocusContext,
type SetEditableFocused,
} from './host/contexts/FrontComponentInputFocusContext';
export { componentRegistry } from './host/generated/host-component-registry';
export { FrontComponentErrorEffect } from './remote/components/FrontComponentErrorEffect';
export { FrontComponentInitializeHostCommunicationApiEffect } from './remote/components/FrontComponentInitializeHostCommunicationApiEffect';
+19 -1
View File
@@ -4,12 +4,18 @@ import { type Preview } from '@storybook/react-vite';
import { initialize, mswLoader } from 'msw-storybook-addon';
import { SOURCE_LOCALE } from 'twenty-shared/translations';
// oxlint-disable-next-line no-restricted-imports
import { DateFormat } from '../src/modules/localization/constants/DateFormat';
// oxlint-disable-next-line no-restricted-imports
import { TimeFormat } from '../src/modules/localization/constants/TimeFormat';
// oxlint-disable-next-line no-restricted-imports
import { FileUploadProvider } from '../src/modules/file-upload/components/FileUploadProvider';
// oxlint-disable-next-line no-restricted-imports
import { RootDecorator } from '../src/testing/decorators/RootDecorator';
// oxlint-disable-next-line no-restricted-imports
import { resetJotaiStore } from '../src/modules/ui/utilities/state/jotai/jotaiStore';
// oxlint-disable-next-line no-restricted-imports
import { UserContext } from '../src/modules/users/contexts/UserContext';
import 'react-loading-skeleton/dist/skeleton.css';
import 'twenty-ui/style.css';
@@ -59,6 +65,16 @@ initialize({
quiet: true,
});
// Mirrors production's MinimalMetadataGater so any story rendering a
// date-aware component (DateTimeDisplay, etc.) sees a real IANA timeZone
// instead of UserContext's default `{}`. Stories needing a specific timezone
// can still override by nesting their own UserContext.Provider.
const STORYBOOK_DEFAULT_USER_CONTEXT = {
dateFormat: DateFormat.DAY_FIRST,
timeFormat: TimeFormat.HOUR_24,
timeZone: 'UTC',
};
const preview: Preview = {
decorators: [
(Story) => {
@@ -69,7 +85,9 @@ const preview: Preview = {
<ClickOutsideListenerContext.Provider
value={{ excludedClickOutsideId: undefined }}
>
<Story />
<UserContext.Provider value={STORYBOOK_DEFAULT_USER_CONTEXT}>
<Story />
</UserContext.Provider>
</ClickOutsideListenerContext.Provider>
</FileUploadProvider>
</ThemeProvider>
@@ -283,7 +283,6 @@ export type FeatureFlag = {
};
export enum FeatureFlagKey {
IS_EMAILING_DOMAIN_ENABLED = 'IS_EMAILING_DOMAIN_ENABLED',
IS_EMAIL_GROUP_ENABLED = 'IS_EMAIL_GROUP_ENABLED',
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
IS_JUNCTION_RELATIONS_ENABLED = 'IS_JUNCTION_RELATIONS_ENABLED',
@@ -399,6 +398,7 @@ export type Mutation = {
setAdminAiModelsRecommended: Scalars['Boolean'];
setAdminDefaultAiModel: Scalars['Boolean'];
setMaintenanceMode: Scalars['Boolean'];
updateAdminApplicationRegistrationVariable: ApplicationRegistrationVariableDto;
updateDatabaseConfigVariable: Scalars['Boolean'];
updateWorkspaceFeatureFlag: Scalars['Boolean'];
};
@@ -492,6 +492,11 @@ export type MutationSetMaintenanceModeArgs = {
};
export type MutationUpdateAdminApplicationRegistrationVariableArgs = {
input: UpdateApplicationRegistrationVariableInput;
};
export type MutationUpdateDatabaseConfigVariableArgs = {
key: Scalars['String'];
value: Scalars['JSON'];
@@ -732,6 +737,17 @@ export type SystemHealthService = {
status: AdminPanelHealthServiceStatus;
};
export type UpdateApplicationRegistrationVariableInput = {
id: Scalars['String'];
update: UpdateApplicationRegistrationVariablePayload;
};
export type UpdateApplicationRegistrationVariablePayload = {
description?: InputMaybe<Scalars['String']>;
resetValue?: InputMaybe<Scalars['Boolean']>;
value?: InputMaybe<Scalars['String']>;
};
export enum UpgradeHealth {
BEHIND = 'BEHIND',
FAILED = 'FAILED',
@@ -923,6 +939,13 @@ export type GetModelsDevSuggestionsQueryVariables = Exact<{
export type GetModelsDevSuggestionsQuery = { __typename?: 'Query', getModelsDevSuggestions: Array<{ __typename?: 'ModelsDevModelSuggestion', modelId: string, name: string, inputCostPerMillionTokens: number, outputCostPerMillionTokens: number, cachedInputCostPerMillionTokens?: number | null, cacheCreationCostPerMillionTokens?: number | null, contextWindowTokens: number, maxOutputTokens: number, modalities: Array<string>, supportsReasoning: boolean }> };
export type UpdateAdminApplicationRegistrationVariableMutationVariables = Exact<{
input: UpdateApplicationRegistrationVariableInput;
}>;
export type UpdateAdminApplicationRegistrationVariableMutation = { __typename?: 'Mutation', updateAdminApplicationRegistrationVariable: { __typename?: 'ApplicationRegistrationVariableDTO', id: string, key: string, description: string, isSecret: boolean, isRequired: boolean, isFilled: boolean, createdAt: string, updatedAt: string } };
export type FindAdminApplicationRegistrationVariablesQueryVariables = Exact<{
applicationRegistrationId: Scalars['String'];
}>;
@@ -1154,6 +1177,7 @@ export const GetAdminAiUsageByWorkspaceDocument = {"kind":"Document","definition
export const GetAiProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAiProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAiProviders"}}]}}]} as unknown as DocumentNode<GetAiProvidersQuery, GetAiProvidersQueryVariables>;
export const GetModelsDevProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"modelCount"}},{"kind":"Field","name":{"kind":"Name","value":"npm"}}]}}]}}]} as unknown as DocumentNode<GetModelsDevProvidersQuery, GetModelsDevProvidersQueryVariables>;
export const GetModelsDevSuggestionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevSuggestions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevSuggestions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"providerType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"inputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"outputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cachedInputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cacheCreationCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"contextWindowTokens"}},{"kind":"Field","name":{"kind":"Name","value":"maxOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"modalities"}},{"kind":"Field","name":{"kind":"Name","value":"supportsReasoning"}}]}}]}}]} as unknown as DocumentNode<GetModelsDevSuggestionsQuery, GetModelsDevSuggestionsQueryVariables>;
export const UpdateAdminApplicationRegistrationVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateAdminApplicationRegistrationVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateApplicationRegistrationVariableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateAdminApplicationRegistrationVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}},{"kind":"Field","name":{"kind":"Name","value":"isRequired"}},{"kind":"Field","name":{"kind":"Name","value":"isFilled"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode<UpdateAdminApplicationRegistrationVariableMutation, UpdateAdminApplicationRegistrationVariableMutationVariables>;
export const FindAdminApplicationRegistrationVariablesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAdminApplicationRegistrationVariables"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAdminApplicationRegistrationVariables"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"applicationRegistrationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}},{"kind":"Field","name":{"kind":"Name","value":"isRequired"}},{"kind":"Field","name":{"kind":"Name","value":"isFilled"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode<FindAdminApplicationRegistrationVariablesQuery, FindAdminApplicationRegistrationVariablesQueryVariables>;
export const FindAllApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"isPreInstalled"}},{"kind":"Field","name":{"kind":"Name","value":"isConfigured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode<FindAllApplicationRegistrationsQuery, FindAllApplicationRegistrationsQueryVariables>;
export const CreateDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode<CreateDatabaseConfigVariableMutation, CreateDatabaseConfigVariableMutationVariables>;
File diff suppressed because one or more lines are too long
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {Jy het nie toestemming om toegang tot die {fieldsList}
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} gevorderde reël} other {{advancedFilterCount} gevorderde reëls}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "{agentLabel} Agentrol"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} van {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Dit sal die geselekteerde werk herprobeer. Dit s
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "{visibleFieldsCount} getoon"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Aksies gebruikers kan uitvoer op hierdie voorwerp"
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Aktiveer"
@@ -1031,16 +1062,15 @@ msgstr "Voeg pasgemaakte instruksies by wat spesifiek is vir jou werkruimte (aan
msgid "Add Custom Provider"
msgstr "Voeg pasgemaakte verskaffer by"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "Voeg E-pos Domein by"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Voeg eerste filter by"
msgid "Add In-Reply-To"
msgstr "Voeg In-Reply-To by"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Bygevoeg {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Bygevoeg {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Gevorderd"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Gevorderde funksie om die werkverrigting van navrae te verbeter en uniekheidsbeperkings af te dwing."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "'n Fout het voorgekom tydens die oplaai van die prent."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "'n Onverwagte fout het voorgekom. Probeer asseblief weer."
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "en"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Toepassings"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Goedgekeurde Domeine"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Argieflêers kan nie voorskou word nie. Laai asseblief die lêer af om t
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "Magtiging het misluk. Probeer asseblief weer."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Otoriseer"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "Gemagtigde URL na knipbord gekopieer"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Magtiging word verwerk..."
@@ -2650,6 +2688,11 @@ msgstr "Terug na {linkText}"
msgid "Back to content"
msgstr "Terug na inhoud"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Brons"
msgid "Brown"
msgstr "Bruin"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "Kan nie skandeer nie? Kopieer die"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "Kan nie skandeer nie? Kopieer die"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Kanselleer"
@@ -3491,6 +3539,11 @@ msgstr "Kode-redigeerder"
msgid "Code Execution"
msgstr "Uitvoering van kode"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "Stel 'n SSO-verbinding op"
msgid "Configure and customize your calendar preferences."
msgstr "Stel op en pas jou kalendervoorkeure aan."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Stel domeine op en verifieer dit vir e-posse vanaf hierdie werkruimte."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Bevestig"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Bevestig verwydering van {roleName} rol? Dit kan nie ongedaan gemaak word nie. Alle lede sal aan die verstekrol toegewys word."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "verwyder"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "verwyder"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "Verwyder app"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Verwyder vaardigheid"
msgid "Delete this agent"
msgstr "Verwyder hierdie agent"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "Bevat nie"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Domein"
@@ -5711,6 +5777,11 @@ msgstr "Byvoorbeeld: \"Ons is 'n B2B SaaS-maatskappy. Gebruik altyd formele taal
msgid "e.g., summary, status, count"
msgstr "bv., opsomming, status, telling"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "anders indien"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "anders indien"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "E-pos na knipbord gekopieer"
msgid "Email Editor"
msgstr "E-posredigeerder"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "E-posdomein suksesvol geskep. Verifieer asseblief die domein om dit te begin gebruik."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "E-posdomein suksesvol uitgevee"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "E-posdomeine"
@@ -6171,6 +6247,11 @@ msgstr "Voer 'n nommer in"
msgid "Enter a UUID"
msgstr "Voer 'n UUID in"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "Voer die geloofsbriewe in om die verbinding te stel"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "Kon nie model byvoeg nie"
msgid "Failed to add provider"
msgstr "Kon nie verskaffer byvoeg nie"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "Kon nie hulpmiddel skep nie"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "velde"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Funksienaam"
msgid "Functions - Settings"
msgstr "Funksies - Instellings"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr ""
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr ""
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Benut jou werkruimte optimaal deur jou span uit te nooi."
msgid "Get your subscription"
msgstr "Kry jou inskrywing"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Versteek versteekte groepe"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Identiteitsverskaffer Metadata XML"
msgid "if"
msgstr "indien"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Inboks"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "indeks"
msgid "Index"
msgstr "Indeks"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Indekse"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "Installeer"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Ongeldige e-pos of domein"
msgid "Invalid email verification link."
msgstr "Ongeldige e-pos verifikasie skakel."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Ongeldige lêer"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "MCP-bediener"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Ek"
@@ -10300,10 +10393,10 @@ msgstr "Nuwe gesprek"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Nuwe vouer"
msgid "New Group"
msgstr "Nuwe Groep"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "Geen vouers beskikbaar nie"
msgid "No folders found for this account"
msgstr "Geen gidse is vir hierdie rekening gevind nie"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "objekte"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Opsionele geheim gebruik om die HMAC-handtekening vir webhook-vragte te bereken"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Rangskik"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Kies 'n aansig"
msgid "Pick an object"
msgstr "Kies 'n objek"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Kwartaal van die jaar"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Verwyder as verstek"
msgid "Remove Deleted filter"
msgstr "Verwyder Gedeleteerde filter"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Voer 'n werkstroom uit en keer hier terug om die uitvoerings te sien"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Soek 'n toegewyde {roleTargetDisplayName}..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Soek 'n indeks..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Kies"
@@ -13777,6 +13911,11 @@ msgstr "Kies 1 veld"
msgid "Select a date"
msgstr "Kies 'n datum"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Stel jou toepassing konfigurasie veranderlikes"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Wys slegs rye met foute"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "Spaans"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "Staat"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "Oortjie Instellings"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "Teks na knipbord gekopieer"
msgid "Text Editor"
msgstr "Teksredigeerder"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "Die e-pos geassosieerd met jou rekening"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16007,6 +16164,7 @@ msgstr "Twee-faktor magtiging-setup suksesvol voltooi!"
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16015,6 +16173,7 @@ msgstr "Twee-faktor magtiging-setup suksesvol voltooi!"
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Tipe"
@@ -16585,6 +16744,11 @@ msgstr "Gebruik slegs die beste modelle"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16716,8 +16880,6 @@ msgstr "Geldigheidstoken is suksesvol herlaai"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Waarde"
@@ -16767,6 +16929,11 @@ msgstr "Verifieer"
msgid "Verify code from the app"
msgstr "Verifieer kode vanaf die app"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17280,6 +17447,7 @@ msgid "Workflows"
msgstr "Werksvloeie"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17311,6 +17479,7 @@ msgstr "Werksvloeie"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17432,11 +17601,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Werkruimte-uitsigte vereis bestuur-uitsigte mag"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17698,11 +17862,6 @@ msgstr "Jou ondernemingsfunksies sal gedeaktiveer word"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Jou ondernemingsfunksies sal aktief bly tot {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, zero {ليس لديك إذن للوصول إلى حقل {fie
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, zero {{advancedFilterCount} قواعد متقدمة} one {{advancedFilterCount} قاعدة متقدمة} two {{advancedFilterCount} قاعدتان متقدمتان} few {{advancedFilterCount} قواعد متقدمة} many {{advancedFilterCount} قواعد متقدمة} other {{advancedFilterCount} قواعد متقدمة}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "دور الوكيل {agentLabel}"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} من {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, zero {سيتم إعادة محاولة {jobCount} و
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "{visibleFieldsCount, plural, zero {لا حقول معروضة} one {حقل واحد معروض} two {حقلان معروضان} few {# حقول معروضة} many {# حقلًا معروضًا} other {# حقل معروض}}"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "الإجراءات التي يمكن للمستخدمين تنفيذها
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "تفعيل"
@@ -1031,16 +1062,15 @@ msgstr "أضف تعليمات مخصصة خاصة بمساحة العمل لدي
msgid "Add Custom Provider"
msgstr "إضافة مزود مخصص"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "أضف نطاق البريد الإلكتروني"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "أضف أول فلتر"
msgid "Add In-Reply-To"
msgstr "إضافة In-Reply-To"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "تم الإضافة {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "تم الإضافة {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "متقدم"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "ميزة متقدمة لتحسين أداء الاستعلامات وفرض قيود التوحيد."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "حدث خطأ أثناء تحميل الصورة."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "حدث خطأ غير متوقع. يرجى المحاولة مرة أخر
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "و"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "تطبيقات"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "النطاقات المعتمدة"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "لا يمكن معاينة ملفات الأرشيف. يرجى تنزي
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "فشل التفويض. يرجى المحاولة مرة أخرى."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "اعتماد"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "تم نسخ رابط URL المرخص إلى الحافظة"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "جاري التفويض..."
@@ -2650,6 +2688,11 @@ msgstr "العودة إلى {linkText}"
msgid "Back to content"
msgstr "العودة إلى المحتوى"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "برونزي"
msgid "Brown"
msgstr "بني"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "هل لا يمكنك المسح؟ انسخ الـ"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "هل لا يمكنك المسح؟ انسخ الـ"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "إلغاء"
@@ -3491,6 +3539,11 @@ msgstr "محرر الشفرات"
msgid "Code Execution"
msgstr "تنفيذ التعليمات البرمجية"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "تهيئة اتصال SSO"
msgid "Configure and customize your calendar preferences."
msgstr "قم بتهيئة وتخصيص تفضيلات التقويم الخاصة بك."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "تهيئة والتحقق من النطاقات لإرسال البريد الإلكتروني من هذه المساحة."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "تأكيد"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "تأكيد حذف دور {roleName}؟ لا يمكن التراجع عن هذا الإجراء. سيتم إعادة تعيين جميع الأعضاء إلى الدور الافتراضي."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "حذف"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "حذف"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "حذف التطبيق"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "حذف المهارة"
msgid "Delete this agent"
msgstr "حذف هذا الوكيل"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "لا يحتوي على"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "النطاق"
@@ -5711,6 +5777,11 @@ msgstr "مثال: \"نحن شركة B2B SaaS. استخدِم دائمًا لغة
msgid "e.g., summary, status, count"
msgstr "على سبيل المثال، ملخص، حالة، تعداد"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "وإلا إذا"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "وإلا إذا"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "تم نسخ البريد الإلكتروني إلى الحافظة"
msgid "Email Editor"
msgstr "محرر البريد الإلكتروني"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "تم إنشاء نطاق البريد الإلكتروني بنجاح. يرجى التحقق من النطاق للبدء في استخدامه."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "تم حذف نطاق البريد الإلكتروني بنجاح"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "نطاقات البريد الإلكتروني"
@@ -6171,6 +6247,11 @@ msgstr "أدخل رقمًا"
msgid "Enter a UUID"
msgstr "أدخل UUID"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "أدخل بيانات الاعتماد لتعيين الاتصال"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "فشل في إضافة النموذج"
msgid "Failed to add provider"
msgstr "فشل في إضافة المزود"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "فشل إنشاء الأداة"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "حقول"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "اسم الوظيفة"
msgid "Functions - Settings"
msgstr "وظائف - إعدادات"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr "الرسم البياني القياسي"
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr "الرسم البياني القياسي"
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "استفد من مساحة العمل الخاصة بك عن طريق د
msgid "Get your subscription"
msgstr "احصل على اشتراكك"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "إخفاء المجموعات المخفية"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "بيانات تعريف موفر الهوية XML"
msgid "if"
msgstr "إذا"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "صندوق الوارد"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "الفهرسات"
msgid "Index"
msgstr "الفهرس"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "الفهرسات"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "تثبيت"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "بريد إلكتروني أو نطاق غير صالح"
msgid "Invalid email verification link."
msgstr "رابط التحقق من البريد الإلكتروني غير صالح."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "ملف غير صالح"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "خادم MCP"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "أنا"
@@ -10300,10 +10393,10 @@ msgstr "محادثة جديدة"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "مجلد جديد"
msgid "New Group"
msgstr "مجموعة جديدة"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "لا توجد مجلدات متاحة"
msgid "No folders found for this account"
msgstr "لم يتم العثور على مجلدات لهذا الحساب"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "الكائنات"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "سر اختياري يُستخدم لحساب توقيع HMAC لأحمال ويبهوك"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "تنظيم"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "اختر عرضًا"
msgid "Pick an object"
msgstr "اختر كائنًا"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "ربع من السنة"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "إزالة كافتراضي"
msgid "Remove Deleted filter"
msgstr "إزالة الفلتر المحذوف"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "\\\\"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "البحث عن {roleTargetDisplayName} معين..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "ابحث عن فهرس..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "اختيار"
@@ -13777,6 +13911,11 @@ msgstr "حدد حقل واحد"
msgid "Select a date"
msgstr "اختر تاريخًا"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "قم بتعيين متغيرات تكوين التطبيق الخاص بك"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "اعرض الصفوف التي تحتوي على أخطاء فقط"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "الإسبانية"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "الولاية"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "إعدادات علامة التبويب"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "تم نسخ النص إلى الحافظة"
msgid "Text Editor"
msgstr "محرر النصوص"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "البريد الإلكتروني المرتبط بحسابك"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16007,6 +16164,7 @@ msgstr "تم إكمال إعداد المصادقة الثنائية بنجاح!
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16015,6 +16173,7 @@ msgstr "تم إكمال إعداد المصادقة الثنائية بنجاح!
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "النوع"
@@ -16585,6 +16744,11 @@ msgstr "استخدام أفضل النماذج فقط"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16716,8 +16880,6 @@ msgstr "تم تحديث رمز الصلاحية بنجاح"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "القيمة"
@@ -16767,6 +16929,11 @@ msgstr "التحقق"
msgid "Verify code from the app"
msgstr "تحقق من الرمز من التطبيق"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17278,6 +17445,7 @@ msgid "Workflows"
msgstr "سير العمل"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17309,6 +17477,7 @@ msgstr "سير العمل"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17430,11 +17599,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "تتطلب عروض مساحة العمل أذونات لإدارة العروض"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17696,11 +17860,6 @@ msgstr "سيتم تعطيل ميزات Enterprise لديك"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "ستظل ميزات Enterprise لديك نشطة حتى {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {No teniu permís per accedir al camp {fieldsList}} othe
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} norma avançada} other {{advancedFilterCount} normes avançades}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "Rol d'agent {agentLabel}"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} de {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Això tornarà a intentar la feina seleccionada.
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "{visibleFieldsCount} mostrats"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Accions que poden realitzar els usuaris en aquest objecte"
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Activa"
@@ -1031,16 +1062,15 @@ msgstr "Afegeix instruccions personalitzades específiques del teu espai de treb
msgid "Add Custom Provider"
msgstr "Afegeix un proveïdor personalitzat"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "Afegeix domini de correu electrònic"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Afegeix el primer filtre"
msgid "Add In-Reply-To"
msgstr "Afegeix In-Reply-To"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Afegit {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Afegit {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Avançat"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Funció avançada per millorar el rendiment de les consultes i fer complir les restriccions d'uniqüitat."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "S'ha produït un error en carregar la imatge."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "S'ha produït un error inesperat. Torna-ho a intentar."
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "i"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Aplicacions"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Dominis Aprovats"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Els fitxers comprimits no es poden previsualitzar. Si us plau, descarreg
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "L'autorització ha fallat. Torna-ho a intentar."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Autoritzar"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "URL autoritzat copiat al porta-retalls"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Autoritzant..."
@@ -2650,6 +2688,11 @@ msgstr "Torna a {linkText}"
msgid "Back to content"
msgstr "Tornar al contingut"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Bronze"
msgid "Brown"
msgstr "Marró"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "No pots escanejar? Copia la"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "No pots escanejar? Copia la"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Cancel·la"
@@ -3491,6 +3539,11 @@ msgstr "Editor de codi"
msgid "Code Execution"
msgstr "Execució de codi"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "Configureu una connexió SSO"
msgid "Configure and customize your calendar preferences."
msgstr "Configureu i personalitzeu les vostres preferències del calendari."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Configura i verifica dominis per enviar correus des d'aquest espai de treball."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Confirmar"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Confirmeu la supressió del rol {roleName}? Aquesta acció no es pot desfer. Tots els membres seran reassignats al rol predeterminat."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "elimina"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "elimina"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "Suprimeix l'aplicació"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Suprimeix l'habilitat"
msgid "Delete this agent"
msgstr "Esborra aquest agent"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "No conté"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Domini"
@@ -5711,6 +5777,11 @@ msgstr "P. ex., \"Som una empresa SaaS B2B. Utilitza sempre un llenguatge formal
msgid "e.g., summary, status, count"
msgstr "p. ex., resum, estat, comptador"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "altrament, si"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "altrament, si"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "Correu electrònic copiat al porta-retalls"
msgid "Email Editor"
msgstr "Editor de correu electrònic"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "Domini de correu creat correctament. Si us plau, verifica el domini per començar a utilitzar-lo."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "Domini de correu eliminat correctament"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "Dominis de correu"
@@ -6171,6 +6247,11 @@ msgstr "Introdueix un número"
msgid "Enter a UUID"
msgstr "Introdueix un UUID"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "Introdueix les credencials per establir la connexió"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "No s'ha pogut afegir el model"
msgid "Failed to add provider"
msgstr "No s'ha pogut afegir el proveïdor"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "No s'ha pogut crear l'eina"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "camps"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Nom de la funció"
msgid "Functions - Settings"
msgstr "Funcions - Configuració"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr "Gràfic de mesurador"
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr "Gràfic de mesurador"
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Treu el màxim partit al teu espai de treball convidant al teu equip."
msgid "Get your subscription"
msgstr "Obteniu la vostra subscripció"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Amaga grups ocults"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Metadades XML del Proveïdor d'Identitat"
msgid "if"
msgstr "si"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Bústia d'entrada"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "índex"
msgid "Index"
msgstr "Índex"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Índexs"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "Instal·la"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Correu electrònic o domini no vàlids"
msgid "Invalid email verification link."
msgstr "Enllaç de verificació del correu electrònic invàlid."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Fitxer invàlid"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "Servidor MCP"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Jo"
@@ -10300,10 +10393,10 @@ msgstr "Nova conversa"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Carpeta nova"
msgid "New Group"
msgstr "Nou grup"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "No hi ha carpetes disponibles"
msgid "No folders found for this account"
msgstr "No s'han trobat carpetes per aquest compte"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "objectes"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Secret opcional usat per calcular la signatura HMAC dels càrregues útils del webhook"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Organitza"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Selecciona una vista"
msgid "Pick an object"
msgstr "Selecciona un objecte"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Trimestre de l'any"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Elimina com a predeterminat"
msgid "Remove Deleted filter"
msgstr "Elimina filtre Eliminat"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Executa un workflow i torna aquí per veure les seves execucions"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Cerca un {roleTargetDisplayName} assignat..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Cerca un índex..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Seleccionar"
@@ -13777,6 +13911,11 @@ msgstr "Selecciona 1 camp"
msgid "Select a date"
msgstr "Selecciona una data"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Configura les variables de configuració de la teva aplicació"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Mostra només les files amb errors"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "Espanyol"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "Estat"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "Configuració de la pestanya"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "Text copiat al porta-retalls"
msgid "Text Editor"
msgstr "Editor de text"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "El correu electrònic associat al vostre compte"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16007,6 +16164,7 @@ msgstr "Configuració de l'autenticació de dos factors completada amb èxit!"
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16015,6 +16173,7 @@ msgstr "Configuració de l'autenticació de dos factors completada amb èxit!"
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Tipus"
@@ -16585,6 +16744,11 @@ msgstr "Utilitzar només els millors models"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16716,8 +16880,6 @@ msgstr "El testimoni de validesa s'ha actualitzat correctament"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Valor"
@@ -16767,6 +16929,11 @@ msgstr "Verifica"
msgid "Verify code from the app"
msgstr "Verifica el codi de l'aplicació"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17280,6 +17447,7 @@ msgid "Workflows"
msgstr "Fluxos de treball"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17311,6 +17479,7 @@ msgstr "Fluxos de treball"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17432,11 +17601,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Les vistes d'espai de treball requereixen permís per gestionar vistes"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17698,11 +17862,6 @@ msgstr "Les vostres funcionalitats Enterprise es desactivaran"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Les vostres funcionalitats Enterprise romandran actives fins al {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {Nemáte povolení pro přístup k poli {fieldsList}} fe
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} pokročilé pravidlo} few {{advancedFilterCount} pokročilá pravidla} many {{advancedFilterCount} pokročilých pravidel} other {{advancedFilterCount} pokročilých pravidel}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "Role agenta {agentLabel}"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} z {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Tato akce znovu spustí vybranou úlohu. Bude sp
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "Zobrazeno {visibleFieldsCount}"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Akce, které uživatelé mohou provádět na tomto objektu"
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Aktivovat"
@@ -1031,16 +1062,15 @@ msgstr "Přidejte vlastní pokyny specifické pro váš pracovní prostor (přip
msgid "Add Custom Provider"
msgstr "Přidat vlastního poskytovatele"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "Přidat e-mailovou doménu"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Přidat první filtr"
msgid "Add In-Reply-To"
msgstr "Přidat In-Reply-To"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Přidáno {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Přidáno {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Pokročilé"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Pokročilá funkce pro zlepšení výkonu dotazů a prosazení jedinečnosti."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "Při nahrávání obrázku došlo k chybě."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "Došlo k neočekávané chybě. Zkuste to prosím znovu."
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "a"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Aplikace"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Schválené domény"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Archivní soubory nelze zobrazit v náhledu. Pro přístup k obsahu si s
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "Autorizace selhala. Zkuste to prosím znovu."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Autorizovat"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "Autorizovaná URL zkopírována do schránky"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Probíhá autorizace..."
@@ -2650,6 +2688,11 @@ msgstr "Zpět na {linkText}"
msgid "Back to content"
msgstr "Zpět k obsahu"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Bronzová"
msgid "Brown"
msgstr "Hnědá"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "Nemůžete skenovat? Zkopírujte"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "Nemůžete skenovat? Zkopírujte"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Storno"
@@ -3491,6 +3539,11 @@ msgstr "Editor kódu"
msgid "Code Execution"
msgstr "Spuštění kódu"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "Nakonfigurujte připojení SSO"
msgid "Configure and customize your calendar preferences."
msgstr "Nakonfigurujte a přizpůsobte si předvolby kalendáře."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Nakonfigurujte a ověřte domény pro odesílání e-mailů z tohoto pracovního prostoru."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Potvrdit"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Opravdu chcete smazat roli {roleName}? Toto akci nelze vrátit zpět. Všichni členové budou přeřazeni na výchozí roli."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "smazat"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "smazat"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "Smazat aplikaci"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Smazat dovednost"
msgid "Delete this agent"
msgstr "Smazat tohoto agenta"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "Neobsahuje"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Doména"
@@ -5711,6 +5777,11 @@ msgstr "Např.: \"Jsme B2B SaaS společnost. Vždy používejte formální jazyk
msgid "e.g., summary, status, count"
msgstr "např. souhrn, stav, počet"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "jinak pokud"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "jinak pokud"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "Email zkopírován do schránky"
msgid "Email Editor"
msgstr "Editor e-mailu"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "E-mailová doména byla úspěšně vytvořena. Prosím, ověřte doménu, abyste ji mohli začít používat."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "E-mailová doména byla úspěšně odstraněna"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "E-mailové domény"
@@ -6171,6 +6247,11 @@ msgstr "Zadejte číslo"
msgid "Enter a UUID"
msgstr "Zadejte UUID"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "Zadejte údaje pro nastavení připojení"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "Nepodařilo se přidat model"
msgid "Failed to add provider"
msgstr "Nepodařilo se přidat poskytovatele"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "Nepodařilo se vytvořit nástroj"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "pole"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Název funkce"
msgid "Functions - Settings"
msgstr "Funkce - Nastavení"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr "Ukazatelový graf"
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr "Ukazatelový graf"
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Získejte maximum ze svého pracovního prostoru tím, že pozvete svůj
msgid "Get your subscription"
msgstr "Získejte své předplatné"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Skrýt skryté skupiny"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Metadata XML poskytovatele identity"
msgid "if"
msgstr "pokud"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Schránka"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "index"
msgid "Index"
msgstr "Index"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Indexy"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "Nainstalovat"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Neplatný e-mail nebo doména"
msgid "Invalid email verification link."
msgstr "Neplatný odkaz na ověření e-mailu."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Neplatný soubor"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "MCP Server"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Já"
@@ -10300,10 +10393,10 @@ msgstr "Nová konverzace"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Nová složka"
msgid "New Group"
msgstr "Nová skupina"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "Žádné složky nejsou k dispozici"
msgid "No folders found for this account"
msgstr "Pro tento účet nebyly nalezeny žádné složky"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "objekty"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Volitelný tajný klíč použitý k výpočtu HMAC podpisu pro údaje webhooks"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Uspořádat"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Vyberte zobrazení"
msgid "Pick an object"
msgstr "Vyberte objekt"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Čtvrtletí roku"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Odstranit jako výchozí"
msgid "Remove Deleted filter"
msgstr "Odstranit smazaný filtr"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Spusťte pracovní postup a vraťte se sem pro zobrazení jeho provedení"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Hledat přiřazeného {roleTargetDisplayName}..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Hledat v indexu..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Vybrat"
@@ -13777,6 +13911,11 @@ msgstr "Vyberte 1 pole"
msgid "Select a date"
msgstr "Vyberte datum"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Nastavte konfigurační proměnné vaší aplikace"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Zobrazit pouze řádky s chybami"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "Španělština"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "Stav"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "Nastavení karet"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "Text zkopírován do schránky"
msgid "Text Editor"
msgstr "Textový editor"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "Email spojený s vaším účtem"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16007,6 +16164,7 @@ msgstr "Nastavení dvoufaktorového ověřování bylo úspěšně dokončeno!"
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16015,6 +16173,7 @@ msgstr "Nastavení dvoufaktorového ověřování bylo úspěšně dokončeno!"
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Typ"
@@ -16585,6 +16744,11 @@ msgstr "Používat pouze nejlepší modely"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16716,8 +16880,6 @@ msgstr "Token platnosti byl úspěšně obnoven"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Hodnota"
@@ -16767,6 +16929,11 @@ msgstr "Ověřit"
msgid "Verify code from the app"
msgstr "Ověřte kód z aplikace"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17280,6 +17447,7 @@ msgid "Workflows"
msgstr "Pracovní postupy"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17311,6 +17479,7 @@ msgstr "Pracovní postupy"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17432,11 +17601,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Pro zobrazení pracovního prostoru je třeba povolení ke správě zobrazení"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17698,11 +17862,6 @@ msgstr "Vaše funkce Enterprise budou deaktivovány"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Vaše funkce Enterprise zůstanou aktivní do {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {Du har ikke tilladelse til at få adgang til {fieldsLis
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} avanceret regel} other {{advancedFilterCount} avancerede regler}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "{agentLabel} Agentrolle"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} af {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Dette vil forsøge det valgte job igen. Det vil
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "{visibleFieldsCount} vist"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Handlinger brugere kan udføre på denne genstand"
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Aktivér"
@@ -1031,16 +1062,15 @@ msgstr "Tilføj brugerdefinerede instruktioner, der er specifikke for dit arbejd
msgid "Add Custom Provider"
msgstr "Tilføj brugerdefineret udbyder"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "Tilføj e-maildomæne"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Tilføj første filter"
msgid "Add In-Reply-To"
msgstr "Tilføj In-Reply-To"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Tilføjet {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Tilføjet {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Avanceret"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Avanceret funktion til at forbedre ydeevnen af forespørgsler og håndhæve unikke begrænsninger."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "Der opstod en fejl under upload af billedet."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "Der opstod en uventet fejl. Prøv igen."
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "og"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Applikationer"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Godkendte domæner"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Arkivfiler kan ikke forhåndsvises. Download venligst filen for at få a
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "Autorisering mislykkedes. Prøv igen."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Autoriser"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "Autoriseret URL kopieret til udklipsholder"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Autoriserer..."
@@ -2650,6 +2688,11 @@ msgstr "Tilbage til {linkText}"
msgid "Back to content"
msgstr "Tilbage til indhold"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Bronze"
msgid "Brown"
msgstr "Brun"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "Kan ikke scanne? Kopier"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "Kan ikke scanne? Kopier"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Annuller"
@@ -3491,6 +3539,11 @@ msgstr "Kodeeditor"
msgid "Code Execution"
msgstr "Kørsel af kode"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "Konfigurer en SSO-forbindelse"
msgid "Configure and customize your calendar preferences."
msgstr "Konfigurer og tilpas dine kalenderpræferencer."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Konfigurer og verificer domæner til at sende e-mails fra dette arbejdsområde."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Bekræft"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Bekræft sletning af {roleName} rolle? Dette kan ikke fortrydes. Alle medlemmer vil blive tildelt standardrollen."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "slet"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "slet"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "Slet app"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Slet færdighed"
msgid "Delete this agent"
msgstr "Slet denne agent"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "Indeholder ikke"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Domæne"
@@ -5711,6 +5777,11 @@ msgstr "F.eks.: \"Vi er en B2B SaaS-virksomhed. Brug altid formelt sprog...\""
msgid "e.g., summary, status, count"
msgstr "f.eks., resumé, status, antal"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "ellers hvis"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "ellers hvis"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "Email kopieret til udklipsholder"
msgid "Email Editor"
msgstr "Email Editor"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "E-mail-domæne oprettet med succes. Bekræft venligst domænet for at begynde at bruge det."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "E-mail-domæne blev slettet med succes."
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "E-mail-domæner"
@@ -6171,6 +6247,11 @@ msgstr "Indtast et tal"
msgid "Enter a UUID"
msgstr "Indtast en UUID"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "Indtast legitimationsoplysningerne for at indstille forbindelsen"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "Kunne ikke tilføje model"
msgid "Failed to add provider"
msgstr "Kunne ikke tilføje udbyder"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "Kunne ikke oprette værktøj"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "felter"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Funktionsnavn"
msgid "Functions - Settings"
msgstr "Funktioner - Indstillinger"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr "Målediagram"
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr "Målediagram"
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Få mest muligt ud af din arbejdsplads ved at invitere dit team."
msgid "Get your subscription"
msgstr "Få dit abonnement"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Skjul skjulte grupper"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Identitetsudbyder Metadata XML"
msgid "if"
msgstr "hvis"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Indbakke"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "indeks"
msgid "Index"
msgstr "Indeks"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Indekser"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr ""
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Ugyldig e-mail eller domæne"
msgid "Invalid email verification link."
msgstr "Ugyldigt link til e-mailverifikation."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Ugyldig fil"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "MCP-Server"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Mig"
@@ -10300,10 +10393,10 @@ msgstr "Ny samtale"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Ny mappe"
msgid "New Group"
msgstr "Ny gruppe"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "Ingen mapper tilgængelige"
msgid "No folders found for this account"
msgstr "Ingen mapper fundet for denne konto"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "objekter"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Valgfri hemmelighed brugt til at beregne HMAC-signatur for webhook-indhold"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Organiser"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Vælg en visning"
msgid "Pick an object"
msgstr "Vælg et objekt"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Kvartal i året"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Fjern som standard"
msgid "Remove Deleted filter"
msgstr "Fjern slettet filter"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Kør en arbejdsproces og vend tilbage hertil for at se dens eksekveringer"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Søg en tildelt {roleTargetDisplayName}..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Søg i et indeks..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Vælg"
@@ -13777,6 +13911,11 @@ msgstr "Vælg 1 felt"
msgid "Select a date"
msgstr "Vælg en dato"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Indstil dine applikationskonfigurationsvariabler"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Vis kun rækker med fejl"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "Spansk"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "Tilstand"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "Fanens indstillinger"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "Tekst kopieret til udklipsholder"
msgid "Text Editor"
msgstr "Teksteditor"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "Den e-mail, der er tilknyttet din konto"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16009,6 +16166,7 @@ msgstr "Opsætning af to-faktor godkendelse blev gennemført med succes!"
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16017,6 +16175,7 @@ msgstr "Opsætning af to-faktor godkendelse blev gennemført med succes!"
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Type"
@@ -16587,6 +16746,11 @@ msgstr "Brug kun de bedste modeller"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16718,8 +16882,6 @@ msgstr "Gyldighedstoken blev opdateret"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Værdi"
@@ -16769,6 +16931,11 @@ msgstr "Bekræft"
msgid "Verify code from the app"
msgstr "Bekræft koden fra appen"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17282,6 +17449,7 @@ msgid "Workflows"
msgstr "Arbejdsgange"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17313,6 +17481,7 @@ msgstr "Arbejdsgange"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17434,11 +17603,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Arbejdsområdevisninger kræver tilladelse til at administrere visninger"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17700,11 +17864,6 @@ msgstr "Dine Enterprise-funktioner vil blive deaktiveret"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Dine Enterprise-funktioner forbliver aktive indtil {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {Sie haben keine Berechtigung, auf das Feld {fieldsList}
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} erweiterte Regel} other {{advancedFilterCount} erweiterte Regeln}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "{agentLabel}-Agentenrolle"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} von {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Dies wird den ausgewählten Auftrag neu ausführ
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "{visibleFieldsCount} angezeigt"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Aktionen, die Benutzer auf diesem Objekt durchführen können"
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Aktivieren"
@@ -1031,16 +1062,15 @@ msgstr "Fügen Sie arbeitsbereichsspezifische benutzerdefinierte Anweisungen hin
msgid "Add Custom Provider"
msgstr "Benutzerdefinierten Anbieter hinzufügen"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "E-Mail-Domain hinzufügen"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Ersten Filter hinzufügen"
msgid "Add In-Reply-To"
msgstr "In-Reply-To hinzufügen"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Hinzugefügt am {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Hinzugefügt am {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Fortgeschritten"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Erweiterte Funktion zur Verbesserung der Abfrageleistung und zur Durchsetzung von Einzigartigkeitsbeschränkungen."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "Beim Hochladen des Bildes ist ein Fehler aufgetreten."
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "und"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Anwendungen"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Genehmigte Domänen"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Archivdateien können nicht in der Vorschau angezeigt werden. Bitte lade
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "Autorisierung fehlgeschlagen. Bitte versuchen Sie es erneut."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Autorisieren"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "Autorisierte URL in die Zwischenablage kopiert"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Wird autorisiert..."
@@ -2650,6 +2688,11 @@ msgstr "Zurück zu {linkText}"
msgid "Back to content"
msgstr "Zurück zum Inhalt"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Bronze"
msgid "Brown"
msgstr "Braun"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "Kann nicht gescannt werden? Kopieren Sie das"
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "Kann nicht gescannt werden? Kopieren Sie das"
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Abbrechen"
@@ -3491,6 +3539,11 @@ msgstr "Code-Editor"
msgid "Code Execution"
msgstr "Codeausführung"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "SSO-Verbindung konfigurieren"
msgid "Configure and customize your calendar preferences."
msgstr "Kalendereinstellungen konfigurieren und anpassen."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Domänen für das Versenden von E-Mails aus diesem Arbeitsbereich konfigurieren und verifizieren."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Bestätigen"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Löschung der Rolle {roleName} bestätigen? Dies kann nicht rückgängig gemacht werden. Alle Mitglieder werden der Standardrolle zugewiesen."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "löschen"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "löschen"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "App löschen"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Skill löschen"
msgid "Delete this agent"
msgstr "Diesen Agenten löschen"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "Enthält nicht"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Domäne"
@@ -5711,6 +5777,11 @@ msgstr "Z. B.: \"Wir sind ein B2B-SaaS-Unternehmen. Verwenden Sie immer eine for
msgid "e.g., summary, status, count"
msgstr "z.B. Zusammenfassung, Status, Anzahl"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "sonst wenn"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "sonst wenn"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "E-Mail in die Zwischenablage kopiert"
msgid "Email Editor"
msgstr "E-Mail-Editor"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "E-Mail-Domäne erfolgreich erstellt. Bitte die Domäne verifizieren, um sie zu nutzen."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "E-Mail-Domäne erfolgreich gelöscht"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "E-Mail-Domänen"
@@ -6171,6 +6247,11 @@ msgstr "Geben Sie eine Zahl ein"
msgid "Enter a UUID"
msgstr "Geben Sie eine UUID ein"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr "Text eingeben oder '/' für Befehle eingeben"
msgid "Enter the credentials to set the connection"
msgstr "Geben Sie die Anmeldedaten ein, um die Verbindung herzustellen"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "Fehler beim Hinzufügen des Modells"
msgid "Failed to add provider"
msgstr "Fehler beim Hinzufügen des Anbieters"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "Erstellen des Tools fehlgeschlagen"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "Felder"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Funktionsname"
msgid "Functions - Settings"
msgstr "Funktionen - Einstellungen"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr ""
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr ""
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Holen Sie das Beste aus Ihrem Arbeitsbereich heraus, indem Sie Ihr Team
msgid "Get your subscription"
msgstr "Abonnement abschließen"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Verborgene Gruppen ausblenden"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Identitätsanbieter-Metadaten XML"
msgid "if"
msgstr "wenn"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Posteingang"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "indizes"
msgid "Index"
msgstr "Indizes"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Indizes"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "Installieren"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Ungültige E-Mail oder Domain"
msgid "Invalid email verification link."
msgstr "Ungültiger E-Mail-Verifizierungslink."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Ungültige Datei"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "MCP-Server"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Ich"
@@ -10300,10 +10393,10 @@ msgstr "Neue Unterhaltung"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Neuer Ordner"
msgid "New Group"
msgstr "Neue Gruppe"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "Keine Ordner verfügbar"
msgid "No folders found for this account"
msgstr "Keine Ordner für dieses Konto gefunden"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "Objekte"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Optionales Geheimnis, um die HMAC-Signatur für Webhook-Nutzlasten zu berechnen"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Organisieren"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Eine Ansicht auswählen"
msgid "Pick an object"
msgstr "Ein Objekt auswählen"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Quartal des Jahres"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Als Standard entfernen"
msgid "Remove Deleted filter"
msgstr "Gelöschten Filter entfernen"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Führen Sie einen Workflow aus und kehren Sie zurück, um die Ausführungen anzuzeigen"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Ein zugewiesenes {roleTargetDisplayName} suchen..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Index suchen..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Auswahl"
@@ -13777,6 +13911,11 @@ msgstr "1 Feld auswählen"
msgid "Select a date"
msgstr "Wählen Sie ein Datum aus"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Konfigurationsvariablen Ihrer Anwendung festlegen"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14232,6 +14371,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Nur Zeilen mit Fehlern anzeigen"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14529,6 +14673,11 @@ msgstr ""
msgid "Spanish"
msgstr "Spanisch"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14638,6 +14787,7 @@ msgstr "Zustand"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15040,6 +15190,8 @@ msgstr "Registerkarteneinstellungen"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15131,6 +15283,16 @@ msgstr "Text in die Zwischenablage kopiert"
msgid "Text Editor"
msgstr "Texteditor"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15206,11 +15368,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "Die mit Ihrem Konto verknüpfte E-Mail"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16007,6 +16164,7 @@ msgstr "Einrichtung der Zwei-Faktor-Authentifizierung erfolgreich abgeschlossen!
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16015,6 +16173,7 @@ msgstr "Einrichtung der Zwei-Faktor-Authentifizierung erfolgreich abgeschlossen!
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Typ"
@@ -16585,6 +16744,11 @@ msgstr "Nur die besten Modelle verwenden"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16716,8 +16880,6 @@ msgstr "Gültigkeitstoken erfolgreich aktualisiert"
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Wert"
@@ -16767,6 +16929,11 @@ msgstr "Verifizieren"
msgid "Verify code from the app"
msgstr "Bestätigen Sie den Code von der App"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17280,6 +17447,7 @@ msgid "Workflows"
msgstr "Workflows"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17311,6 +17479,7 @@ msgstr "Workflows"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17432,11 +17601,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Arbeitsplatzansichten erfordern das Verwaltensrecht von Ansichten"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17698,11 +17862,6 @@ msgstr "Ihre Enterprise-Funktionen werden deaktiviert"
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Ihre Enterprise-Funktionen bleiben bis {cancelAtDate} aktiv."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."
+254 -95
View File
@@ -161,6 +161,7 @@ msgstr "{0, plural, one {Δεν έχετε άδεια πρόσβασης στο
#. js-lingui-id: pZCK0D
#. placeholder {0}: registration.name
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "{0} - Config"
msgstr ""
@@ -210,6 +211,12 @@ msgstr ""
msgid "{0} widgets"
msgstr ""
#. js-lingui-id: 2UKfhY
#. placeholder {0}: selectedItemNames.length
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "{0} workspace members"
msgstr ""
#. js-lingui-id: xTgz1F
#. placeholder {1}: provider.displayName
#: src/pages/settings/applications/tabs/SettingsApplicationConnectionsSection.tsx
@@ -221,6 +228,11 @@ msgstr ""
msgid "{advancedFilterCount, plural, one {{advancedFilterCount} advanced rule} other {{advancedFilterCount} advanced rules}}"
msgstr "{advancedFilterCount, plural, one {{advancedFilterCount} προχωρημένος κανόνας} other {{advancedFilterCount} προχωρημένοι κανόνες}}"
#. js-lingui-id: XWd9bY
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{agentCount, plural, one {{agentCount} agent} other {{agentCount} agents}}"
msgstr ""
#. js-lingui-id: WGnqk6
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/hooks/useWorkflowAiAgentPermissionActions.ts
msgid "{agentDisplayName} role ({agentIdPrefix})"
@@ -236,6 +248,16 @@ msgstr "{agentLabel} Ρόλος Πράκτορα"
msgid "{aggregateLabel} of {fieldLabel}"
msgstr "{aggregateLabel} του {fieldLabel}"
#. js-lingui-id: WhHyQh
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{apiKeyCount, plural, one {{apiKeyCount} API key} other {{apiKeyCount} API keys}}"
msgstr ""
#. js-lingui-id: u1mVnV
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "{appDisplayName} would like to:"
msgstr ""
#. js-lingui-id: ZZZxmp
#: src/pages/auth/Authorize.tsx
msgid "{appName} would like to:"
@@ -390,6 +412,11 @@ msgstr "{jobCount, plural, one {Αυτό θα επαναλάβει την επι
msgid "{label} list"
msgstr ""
#. js-lingui-id: 1DrH/j
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "{memberCount, plural, one {{memberCount} member} other {{memberCount} members}}"
msgstr ""
#. js-lingui-id: Y32cMj
#: src/modules/page-layout/widgets/email-thread/components/EmailThreadIntermediaryMessages.tsx
msgid "{messagesLength} emails"
@@ -518,6 +545,11 @@ msgstr ""
msgid "{visibleFieldsCount} shown"
msgstr "Εμφανίζονται {visibleFieldsCount}"
#. js-lingui-id: WjjsAL
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
msgid "{visibleFieldsCount} visible fields"
msgstr ""
#. js-lingui-id: riMLMq
#: src/modules/workflow/workflow-steps/workflow-actions/iterator-action/components/WorkflowIteratorSubStepSwitcher.tsx
msgid "{workflowRunIteratorSubStepIterationsCount, plural, one {# item} other {# items}}"
@@ -896,7 +928,6 @@ msgstr "Ενέργειες χρηστών που μπορούν να εκτελ
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Activate"
msgstr "Ενεργοποίηση"
@@ -1031,16 +1062,15 @@ msgstr "Προσθέστε προσαρμοσμένες οδηγίες που α
msgid "Add Custom Provider"
msgstr "Προσθήκη Προσαρμοσμένου Παρόχου"
#. js-lingui-id: 33pO0a
#. js-lingui-id: +Gf1IN
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Add email group"
msgid "Add email handle"
msgstr ""
#. js-lingui-id: 3O3+7h
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
msgid "Add Emailing Domain"
msgstr "Προσθήκη Τομέα Αλληλογραφίας"
#. js-lingui-id: HMM0Sc
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Add emailing domain"
msgstr ""
#. js-lingui-id: DpV70M
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
@@ -1082,6 +1112,12 @@ msgstr "Προσθήκη πρώτου φίλτρου"
msgid "Add In-Reply-To"
msgstr "Προσθήκη In-Reply-To"
#. js-lingui-id: iT7UeX
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Add Index"
msgstr ""
#. js-lingui-id: 7XzAKI
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormBuilder.tsx
msgid "Add inputs to your form"
@@ -1301,7 +1337,6 @@ msgid "Added {beautifiedCreatedAt}"
msgstr "Προστέθηκε {beautifiedCreatedAt}"
#. js-lingui-id: jEHeq+
#: src/pages/settings/emailing-domains/SettingsEmailingDomains.tsx
#: src/modules/settings/security/components/approvedAccessDomains/SettingsApprovedAccessDomainsListCard.tsx
msgid "Added {beautifyPastDateRelative}"
msgstr "Προστέθηκε {beautifyPastDateRelative}"
@@ -1350,6 +1385,7 @@ msgstr ""
#. js-lingui-id: 2GX/U+
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
msgid "Admin Panel - Apps"
msgstr ""
@@ -1385,11 +1421,6 @@ msgstr "Προηγμένο"
msgid "Advanced Encryption"
msgstr ""
#. js-lingui-id: +uqBul
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
msgid "Advanced feature to improve the performance of queries and to enforce unicity constraints."
msgstr "Σύνθετη λειτουργία για τη βελτίωση της απόδοσης ερωτημάτων και την επιβολή περιορισμών μοναδικότητας."
#. js-lingui-id: tMFFwF
#: src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx
msgid "Advanced filter"
@@ -1910,8 +1941,10 @@ msgstr "Παρουσιάστηκε σφάλμα κατά τη μεταφόρτω
#: src/modules/object-metadata/hooks/useUpdateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useDeleteOneFieldMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneIndexMetadataItem.ts
#: src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
#: src/modules/logic-functions/hooks/usePersistLogicFunction.ts
@@ -1946,6 +1979,7 @@ msgstr "Παρουσιάστηκε ένα απρόσμενο σφάλμα. Δο
#. js-lingui-id: HZFm5R
#: src/utils/date-utils.ts
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
#: src/modules/auth/sign-in-up/components/FooterNote.tsx
msgid "and"
msgstr "και"
@@ -2180,7 +2214,6 @@ msgstr ""
#: src/pages/settings/applications/SettingsApplicationDetails.tsx
#: src/pages/settings/applications/SettingsApplicationConnectionDetail.tsx
#: src/pages/settings/applications/SettingsApplicationCommandMenuItemDetail.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Applications"
msgstr "Εφαρμογές"
@@ -2212,7 +2245,6 @@ msgid "Approved Domains"
msgstr "Εγκεκριμένοι Τομείς"
#. js-lingui-id: VDvaN2
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
@@ -2249,9 +2281,15 @@ msgstr "Τα συμπιεσμένα αρχεία δεν μπορούν να πρ
msgid "Archived"
msgstr ""
#. js-lingui-id: mk25CW
#. js-lingui-id: Yzbh3i
#. placeholder {0}: emailingDomain.domain
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Are you sure you want to delete {0}? Outbound mail through this domain will stop working."
msgstr ""
#. js-lingui-id: Faev6R
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Are you sure you want to delete {sourceHandle}? Forwarded emails will no longer arrive in this workspace."
msgid "Are you sure you want to delete {sourceHandle}? Inbound mail forwarded to this address and outbound replies from it will stop working."
msgstr ""
#. js-lingui-id: 4CHeVx
@@ -2551,7 +2589,7 @@ msgid "Authorization failed. Please try again."
msgstr "Η εξουσιοδότηση απέτυχε. Δοκιμάστε ξανά."
#. js-lingui-id: yIVrHZ
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorize"
msgstr "Εξουσιοδότηση"
@@ -2566,7 +2604,7 @@ msgid "Authorized URL copied to clipboard"
msgstr "Το εξουσιοδοτημένο URL αντιγράφηκε στο πρόχειρο"
#. js-lingui-id: 8RmQki
#: src/pages/auth/Authorize.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
msgid "Authorizing..."
msgstr "Γίνεται εξουσιοδότηση..."
@@ -2650,6 +2688,11 @@ msgstr "Πίσω στο {linkText}"
msgid "Back to content"
msgstr "Επιστροφή στο περιεχόμενο"
#. js-lingui-id: 9aZHfH
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Back to settings"
msgstr ""
#. js-lingui-id: GtJbUa
#: src/modules/error-handler/components/AppRootErrorFallback.tsx
msgid "Background"
@@ -2822,6 +2865,11 @@ msgstr "Μπρονζέ"
msgid "Brown"
msgstr "Καφέ"
#. js-lingui-id: GsXRxc
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "BTREE (default, good for sorting and equality)"
msgstr ""
#. js-lingui-id: vwZV+4
#: src/modules/ai/components/suggested-prompts/default-suggested-prompts.ts
msgid "Build a dashboard that shows: (1) total pipeline value by stage for the last 3 months, (2) count of deals won vs lost per month, (3) average deal size. Use our standard pipeline stages."
@@ -3005,7 +3053,6 @@ msgstr "Δεν μπορείτε να σαρώσετε; Αντιγράψτε το
#. js-lingui-id: dEgA5A
#: src/pages/settings/applications/components/SettingsApplicationConnectScopePickerModal.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDangerZone.tsx
#: src/pages/auth/Authorize.tsx
#: src/modules/ui/layout/modal/components/ConfirmationModal.tsx
#: src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
#: src/modules/spreadsheet-import/steps/components/ImportDataStep.tsx
@@ -3017,6 +3064,7 @@ msgstr "Δεν μπορείτε να σαρώσετε; Αντιγράψτε το
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/settings/components/SaveAndCancelButtons/CancelButton.tsx
#: src/modules/object-record/record-update-multiple/components/UpdateMultipleRecordsFooter.tsx
#: src/modules/applications/components/AuthorizeActionButtons.tsx
#: src/modules/activities/emails/components/EmailComposer.tsx
msgid "Cancel"
msgstr "Ακύρωση"
@@ -3491,6 +3539,11 @@ msgstr "Επεξεργαστής Κώδικα"
msgid "Code Execution"
msgstr "Εκτέλεση κώδικα"
#. js-lingui-id: T9qjpu
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Code Interpreter"
msgstr ""
#. js-lingui-id: bKJYIa
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionCodeEditorTab.tsx
msgid "Code your function"
@@ -3705,11 +3758,6 @@ msgstr "Ρυθμίστε μια σύνδεση SSO"
msgid "Configure and customize your calendar preferences."
msgstr "Ρυθμίστε και προσαρμόστε τις προτιμήσεις του ημερολογίου σας."
#. js-lingui-id: 5i71HM
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
msgid "Configure and verify domains for emailing from this workspace."
msgstr "Διαμορφώστε και επαληθεύστε τις περιοχές για αποστολή email από αυτό το χώρο εργασίας."
#. js-lingui-id: 6MDr1S
#: src/modules/settings/accounts/components/SettingsAccountsConnectionForm.tsx
msgid "Configure CalDAV settings to sync your calendar events."
@@ -3798,10 +3846,15 @@ msgstr "Επιβεβαίωση"
msgid "Confirm changing your current resource credit allocation."
msgstr ""
#. js-lingui-id: FbJ7Si
#. js-lingui-id: SU6Tym
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. All members will be reassigned to the default role."
msgstr "Επιβεβαιώστε την διαγραφή του ρόλου {roleName}; Αυτό δεν μπορεί να αναιρεθεί. Όλα τα μέλη θα επανατοποθετηθούν στον προεπιλεγμένο ρόλο."
msgid "Confirm deletion of {roleName} role? This cannot be undone."
msgstr ""
#. js-lingui-id: W7S+Tm
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettingsDeleteRoleConfirmationModalSubtitle.tsx
msgid "Confirm deletion of {roleName} role? This cannot be undone. {reassignSubject} will be reassigned to the default role."
msgstr ""
#. js-lingui-id: kZkFSm
#: src/modules/settings/billing/components/internal/ResourceCreditPriceSelector.tsx
@@ -5071,6 +5124,8 @@ msgstr "διαγραφή"
#. js-lingui-id: cnGeoo
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
@@ -5092,12 +5147,12 @@ msgstr "διαγραφή"
#: src/modules/side-panel/pages/page-layout/components/CanvasTabSettingsContent.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/modules/settings/domains/components/SettingPublicDomainRowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminQueueJobRowDropdownMenu.tsx
@@ -5175,9 +5230,14 @@ msgstr "Διαγραφή εφαρμογής"
msgid "Delete chat"
msgstr ""
#. js-lingui-id: /BTna7
#. js-lingui-id: cC09EO
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Delete email group"
msgid "Delete email handle"
msgstr ""
#. js-lingui-id: yZyuut
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Delete emailing domain"
msgstr ""
#. js-lingui-id: gf2eXy
@@ -5240,6 +5300,11 @@ msgstr "Διαγραφή δεξιότητας"
msgid "Delete this agent"
msgstr "Διαγραφή αυτού του πράκτορα"
#. js-lingui-id: +RYIn9
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Delete this index?"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
@@ -5513,6 +5578,7 @@ msgstr "Δεν περιλαμβάνει"
#. js-lingui-id: EoKe5U
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Domain"
msgstr "Τομέας"
@@ -5711,6 +5777,11 @@ msgstr "Π.χ., \"Είμαστε μια εταιρεία B2B SaaS. Να χρησ
msgid "e.g., summary, status, count"
msgstr "π.χ., σύνοψη, κατάσταση, πλήθος"
#. js-lingui-id: npNQJR
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Each index speeds up reads on the fields it covers, but slows down every insert and update, and uses disk space. Only add an index when you know which queries it serves."
msgstr ""
#. js-lingui-id: 79hamt
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Each slice represents"
@@ -5874,9 +5945,14 @@ msgid "else if"
msgstr "αλλιώς εάν"
#. js-lingui-id: O3oNi5
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersTeamTab.tsx
#: src/pages/settings/members/tabs/SettingsWorkspaceMembersInviteTab.tsx
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
#: src/pages/auth/PasswordReset.tsx
@@ -5885,7 +5961,9 @@ msgstr "αλλιώς εάν"
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTableHeader.tsx
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
#: src/modules/settings/members/components/MemberInfosTab.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/object-record/record-field/ui/meta-types/input/components/EmailsFieldInput.tsx
#: src/modules/auth/sign-in-up/components/internal/SignInUpEmailField.tsx
msgid "Email"
@@ -5914,9 +5992,9 @@ msgstr "Το email αντιγράφηκε στο πρόχειρο"
msgid "Email Editor"
msgstr "Επεξεργαστής Email"
#. js-lingui-id: KQM9eG
#. js-lingui-id: nsVRM/
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Email Groups"
msgid "Email Handles"
msgstr ""
#. js-lingui-id: lfQsvW
@@ -5986,14 +6064,12 @@ msgid "Emailing domain created successfully. Please verify the domain to start u
msgstr "Η περιοχή email δημιουργήθηκε με επιτυχία. Παρακαλώ επαληθεύστε την περιοχή για να ξεκινήσετε τη χρήση της."
#. js-lingui-id: XDpopO
#: src/modules/settings/emailing-domains/components/SettingsEmailingDomainRowDropdownMenu.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
msgid "Emailing domain deleted successfully"
msgstr "Η περιοχή email διαγράφηκε με επιτυχία"
#. js-lingui-id: axQccV
#: src/pages/settings/emailing-domains/SettingsNewEmailingDomain.tsx
#: src/pages/settings/emailing-domains/SettingsEmailingDomainDetail.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Emailing Domains"
msgstr "Περιοχές Email"
@@ -6171,6 +6247,11 @@ msgstr "Εισάγετε έναν αριθμό"
msgid "Enter a UUID"
msgstr "Εισάγετε ένα UUID"
#. js-lingui-id: 0AYT5C
#: src/modules/settings/application-registrations/components/ApplicationRegistrationConfigVariableEditForm.tsx
msgid "Enter a value"
msgstr ""
#. js-lingui-id: oiVP/+
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
msgid "Enter a value to store in database"
@@ -6315,11 +6396,6 @@ msgstr ""
msgid "Enter the credentials to set the connection"
msgstr "Εισάγετε τα διαπιστευτήρια για να ρυθμίσετε τη σύνδεση"
#. js-lingui-id: PTGfBH
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Enter the email address you want to forward emails from (e.g. [email protected])."
msgstr ""
#. js-lingui-id: rGWgcm
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Enter the infos to set the connection"
@@ -6926,9 +7002,9 @@ msgstr "Αποτυχία προσθήκης μοντέλου"
msgid "Failed to add provider"
msgstr "Αποτυχία προσθήκης παρόχου"
#. js-lingui-id: d+6i8z
#. js-lingui-id: L9UnOU
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "Failed to create email group channel. Email group may not be configured on this server."
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
@@ -6936,9 +7012,9 @@ msgstr ""
msgid "Failed to create tool"
msgstr "Αποτυχία δημιουργίας εργαλείου"
#. js-lingui-id: W4hzLB
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email group channel."
msgid "Failed to delete email handle."
msgstr ""
#. js-lingui-id: pUligB
@@ -7260,10 +7336,13 @@ msgstr "πεδία"
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/constants/SettingsObjectTableMetadata.ts
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/pages/settings/applications/components/SettingsApplicationDataTable.tsx
#: src/modules/side-panel/utils/getSidePanelSubPageTitle.ts
#: src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect.tsx
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionFieldSelectFieldMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx
@@ -7652,16 +7731,9 @@ msgstr "Όνομα συνάρτησης"
msgid "Functions - Settings"
msgstr "Λειτουργίες - Ρυθμίσεις"
#. js-lingui-id: vYj1cC
#: src/modules/side-panel/pages/page-layout/constants/GraphTypeInformation.ts
#: src/modules/page-layout/utils/getWidgetTitle.ts
msgid "Gauge Chart"
msgstr "Διάγραμμα δείκτη"
#. js-lingui-id: Weq9zb
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
#: src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx
#: src/pages/settings/applications/components/SettingsApplicationRegistrationGeneralInfo.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
@@ -7669,7 +7741,6 @@ msgstr "Διάγραμμα δείκτη"
#: src/modules/settings/domains/components/SettingsSubdomain.tsx
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroupsForDisplay.ts
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
msgid "General"
@@ -7726,6 +7797,16 @@ msgstr "Αξιοποιείστε τον χώρο εργασίας σας με τ
msgid "Get your subscription"
msgstr "Αποκτήστε τη συνδρομή σας"
#. js-lingui-id: XXtAx5
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
msgid "GIN (full-text search and JSONB)"
msgstr ""
#. js-lingui-id: lwDz5R
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Global search"
msgstr ""
#. js-lingui-id: sr0UJD
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Go Back"
@@ -7997,6 +8078,11 @@ msgstr "Απόκρυψη κρυφών ομάδων"
msgid "Hide label"
msgstr ""
#. js-lingui-id: y9sG4l
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Hide system indexes"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
msgid "Home"
@@ -8188,11 +8274,6 @@ msgstr "Μεταδεδομένα XML Παρόχου Ταυτότητας"
msgid "if"
msgstr "εάν"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: bTDz/2
#: src/modules/settings/admin-panel/health-status/maintenance-mode/components/SettingsAdminMaintenanceMode.tsx
msgid "If there's no link, no button will appear."
@@ -8368,11 +8449,6 @@ msgstr "Εισερχόμενα"
msgid "Include emails where all participants share the same domain."
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -8388,9 +8464,18 @@ msgstr "ευρετήριο"
msgid "Index"
msgstr "Ευρετήριο"
#. js-lingui-id: O+81DP
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Index created"
msgstr ""
#. js-lingui-id: R6uY2r
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Index deleted"
msgstr ""
#. js-lingui-id: pZ/USH
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectIndexes.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Indexes"
msgstr "Ευρετήρια"
@@ -8470,6 +8555,11 @@ msgstr ""
msgid "Install"
msgstr "Εγκατάσταση"
#. js-lingui-id: XOHdRf
#: src/modules/marketplace/components/SettingsApplicationInstallPermissionValidationModal.tsx
msgid "Install {appDisplayName} on your workspace"
msgstr ""
#. js-lingui-id: 4ZM8/a
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
msgid "Install and manage applications"
@@ -8607,10 +8697,11 @@ msgstr "Μη έγκυρο email ή domain"
msgid "Invalid email verification link."
msgstr "Μη έγκυρος σύνδεσμος επαλήθευσης email."
#. js-lingui-id: uzxr9u
#. js-lingui-id: 4D6/HO
#. placeholder {0}: samlMetadataParsed.reason
#: src/modules/settings/security/components/SSO/SettingsSSOSAMLForm.tsx
msgid "Invalid File"
msgstr "Μη έγκυρο αρχείο"
msgid "Invalid file: {0}"
msgstr ""
#. js-lingui-id: 04zLGG
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerCronForm.tsx
@@ -9729,6 +9820,8 @@ msgstr "Διακομιστής MCP"
#. js-lingui-id: upbzgm
#: src/modules/views/hooks/useComputeRecordRelationFilterLabelValue.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInput.tsx
msgid "Me"
msgstr "Εγώ"
@@ -10300,10 +10393,10 @@ msgstr "Νέα συνομιλία"
msgid "New Email"
msgstr ""
#. js-lingui-id: TmlJkc
#. js-lingui-id: VJZNJt
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "New Email Group"
msgid "New Email Handle"
msgstr ""
#. js-lingui-id: wqoYqp
@@ -10331,6 +10424,12 @@ msgstr "Νέος φάκελος"
msgid "New Group"
msgstr "Νέα ομάδα"
#. js-lingui-id: //H2Cs
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "New Index"
msgstr ""
#. js-lingui-id: o8MyXb
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
msgid "New key"
@@ -10760,6 +10859,11 @@ msgstr "Δεν υπάρχουν διαθέσιμοι φάκελοι"
msgid "No folders found for this account"
msgstr "Δεν βρέθηκαν φάκελοι για αυτόν το λογαριασμό"
#. js-lingui-id: 9kCSLK
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
msgid "No indexes match your filters."
msgstr ""
#. js-lingui-id: gIrKyO
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "No input"
@@ -11317,6 +11421,7 @@ msgstr "αντικείμενα"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationDetailContentTab.tsx
@@ -11556,6 +11661,7 @@ msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr "Προαιρετικό μυστικό που χρησιμοποιείται για τον υπολογισμό της υπογραφής HMAC για φορτία webhook"
#. js-lingui-id: 0zpgxV
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/modules/ui/layout/dropdown/components/OptionsDropdownMenu.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx
@@ -11625,9 +11731,11 @@ msgstr "Οργάνωση"
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminConfigVariableDetails.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminApplicationRegistrationConfigVariableDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdmin.tsx
#: src/modules/sign-in-background-mock/components/BackgroundMockNavigationDrawer.tsx
#: src/modules/side-panel/pages/workflow/action/components/SidePanelWorkflowSelectAction.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
@@ -11969,6 +12077,16 @@ msgstr "Επιλέξτε μια προβολή"
msgid "Pick an object"
msgstr "Επιλέξτε ένα αντικείμενο"
#. js-lingui-id: JHXjkT
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick one or more fields. The order you select them in becomes the column order in the index — important for composite queries. For composite fields like Address, pick the specific sub-column to index."
msgstr ""
#. js-lingui-id: X1kz7Q
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Pick the index type. BTREE covers most queries; GIN is for full-text and JSONB."
msgstr ""
#. js-lingui-id: N0+GsR
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsProfile.tsx
@@ -12420,6 +12538,11 @@ msgstr "Τρίμηνο του έτους"
msgid "quarters"
msgstr ""
#. js-lingui-id: Z9go8W
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Queries that relied on it will fall back to a sequential scan. You can recreate it later."
msgstr ""
#. js-lingui-id: /IUt/5
#: src/modules/settings/admin-panel/health-status/components/SettingsAdminWorkerHealthStatus.tsx
msgid "Queue information is not available because the worker is down"
@@ -12806,6 +12929,11 @@ msgstr "Αφαίρεση ως προεπιλεγμένο"
msgid "Remove Deleted filter"
msgstr "Αφαίρεση φίλτρου διαγραμμένων"
#. js-lingui-id: /hrkZs
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Remove field"
msgstr ""
#. js-lingui-id: 9VZ6f0
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelEditOrganizeActions.tsx
msgid "Remove from sidebar"
@@ -13273,6 +13401,11 @@ msgstr ""
msgid "Run a workflow and return here to view its executions"
msgstr "Εκτελέστε ένα workflow και επιστρέψτε εδώ για να δείτε τις εκτελέσεις του"
#. js-lingui-id: rRyKdg
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useActionRolePermissionFlagConfig.ts
msgid "Run code to analyze files and data"
msgstr ""
#. js-lingui-id: UPaWvi
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTestTab.tsx
msgid "Run Function"
@@ -13477,7 +13610,7 @@ msgid "Search an assigned {roleTargetDisplayName}..."
msgstr "Αναζήτηση ανατεθέντος {roleTargetDisplayName}..."
#. js-lingui-id: k7kp5/
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectIndexesSection.tsx
msgid "Search an index..."
msgstr "Αναζήτηση ευρετηρίου..."
@@ -13758,6 +13891,7 @@ msgstr ""
#. js-lingui-id: rG3WVm
#: src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx
#: src/modules/spreadsheet-import/steps/components/SelectHeaderStep/components/SelectColumn.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormWorkspaceMemberFilterValueInputTrigger.tsx
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordFieldChip.tsx
msgid "Select"
msgstr "Επιλογή"
@@ -13777,6 +13911,11 @@ msgstr "Επιλογή 1 πεδίου"
msgid "Select a date"
msgstr "Επιλέξτε ημερομηνία"
#. js-lingui-id: 1YV5aa
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexFieldsForm.tsx
msgid "Select a field"
msgstr ""
#. js-lingui-id: bP/w4M
#: src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx
msgid "Select a field from a previous step"
@@ -14093,11 +14232,6 @@ msgstr ""
msgid "Set your application configuration variables"
msgstr "Ορίστε τις μεταβλητές ρυθμίσεων της εφαρμογής σας"
#. js-lingui-id: 9qcWSO
#: src/pages/settings/applications/components/SettingsApplicationRegistrationConfigVariableDetail.tsx
msgid "set-config-value"
msgstr ""
#. js-lingui-id: dQsqpC
#: src/pages/onboarding/CreateWorkspace.tsx
msgid "Setting up your database..."
@@ -14177,6 +14311,11 @@ msgstr ""
msgid "Share your app to other workspaces without pushing it on the marketplace"
msgstr ""
#. js-lingui-id: 9ZxCpH
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Shared addresses your workspace uses to send and receive email."
msgstr ""
#. js-lingui-id: NyIsOu
#: src/pages/settings/applications/components/SettingsApplicationRegistrationShareLinkButtons.tsx
msgid "Sharing link copied to clipboard"
@@ -14234,6 +14373,11 @@ msgstr ""
msgid "Show only rows with errors"
msgstr "Εμφάνιση μόνο γραμμών με λάθη"
#. js-lingui-id: 3UVA3z
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Show this object's records in the command menu (⌘K)."
msgstr ""
#. js-lingui-id: TJ4tz9
#: src/modules/side-panel/pages/page-layout/constants/settings/ChartConfigurationSettingLabels.ts
msgid "Show value in center"
@@ -14531,6 +14675,11 @@ msgstr ""
msgid "Spanish"
msgstr "Ισπανικά"
#. js-lingui-id: pyfee5
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Speed up reads on the fields you filter or sort by most. Each index also slows down writes and uses disk space, so add them with intent."
msgstr ""
#. js-lingui-id: gsifzp
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
#: src/modules/side-panel/pages/page-layout/utils/__tests__/shouldHideChartSetting.test.ts
@@ -14640,6 +14789,7 @@ msgstr "Κατάσταση"
#: src/pages/settings/admin-panel/SettingsAdminWorkspaceDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminInstanceStatus.tsx
#: src/pages/settings/admin-panel/SettingsAdminIndicatorHealthStatus.tsx
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/signing-keys/components/SettingsAdminSigningKeysTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -15042,6 +15192,8 @@ msgstr "Ρυθμίσεις Καρτέλας"
#: src/pages/settings/security/event-logs/components/EventLogTableSelector.tsx
#: src/pages/settings/layout/SettingsLayoutViewDetail.tsx
#: src/modules/views/view-picker/constants/ViewPickerTypeSelectOptions.ts
#: src/modules/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings.tsx
#: src/modules/side-panel/pages/page-layout/components/dropdown-content/FieldWidgetLayoutDropdownContent.tsx
#: src/modules/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutContent.tsx
#: src/modules/keyboard-shortcut-menu/components/KeyboardShortcutMenuOpenContent.tsx
@@ -15133,6 +15285,16 @@ msgstr "Το κείμενο αντιγράφηκε στο πρόχειρο"
msgid "Text Editor"
msgstr "Επεξεργαστής Κειμένου"
#. js-lingui-id: KJjmr/
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The address your workspace sends and receives email from."
msgstr ""
#. js-lingui-id: Z4WP0F
#: src/modules/settings/accounts/components/SettingsAccountsNewEmailGroupChannel.tsx
msgid "The address your workspace will send and receive email from (e.g. [email protected]). Outbound sending requires the domain to be verified in Outbound Domains."
msgstr ""
#. js-lingui-id: oVH0Mt
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "The API endpoint for your OpenAI-compatible provider"
@@ -15208,11 +15370,6 @@ msgstr ""
msgid "The email associated to your account"
msgstr "Το email που συνδέεται με τον λογαριασμό σας"
#. js-lingui-id: TQGLgF
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "The external address whose mail is forwarded into the workspace."
msgstr ""
#. js-lingui-id: diO3fm
#: src/modules/workflow/workflow-trigger/components/WorkflowEditTriggerManual.tsx
msgid "The icon your workflow trigger will display in the command menu"
@@ -16011,6 +16168,7 @@ msgstr "Η εγκατάσταση δύο παραγοντικής ταυτοπο
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/layout/SettingsLayoutPageLayoutDetail.tsx
#: src/pages/settings/data-model/SettingsObjectIndexTable.tsx
#: src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx
#: src/pages/settings/applications/components/SettingsApplicationsTable.tsx
#: src/pages/settings/ai/constants/SettingsSkillTableMetadata.ts
#: src/pages/settings/ai/constants/SettingsAiAgentTableMetadata.ts
@@ -16019,6 +16177,7 @@ msgstr "Η εγκατάσταση δύο παραγοντικής ταυτοπο
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputFieldTypeSelector.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/indexes/forms/components/SettingsObjectIndexOptionsForm.tsx
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
msgid "Type"
msgstr "Τύπος"
@@ -16589,6 +16748,11 @@ msgstr "Χρήση μόνο των καλύτερων μοντέλων"
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: 1Y7Unr
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
msgid "Use indexes sparingly"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -16720,8 +16884,6 @@ msgstr "Το διακριτικό εγκυρότητας ανανεώθηκε μ
#: src/modules/settings/components/SettingsDnsRecordsTable.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/settings/admin-panel/config-variables/components/ConfigVariableValueInput.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
#: src/modules/page-layout/widgets/graph/graph-widget-gauge-chart/components/GraphWidgetGaugeChart.tsx
msgid "Value"
msgstr "Αξία"
@@ -16771,6 +16933,11 @@ msgstr "Επαλήθευση"
msgid "Verify code from the app"
msgstr "Επαληθεύστε τον κωδικό από την εφαρμογή"
#. js-lingui-id: hdyekU
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailingDomainsSection.tsx
msgid "Verify domains so the workspace can send outbound email through them."
msgstr ""
#. js-lingui-id: zS/rMV
#: src/pages/settings/SettingsTwoFactorAuthenticationMethod.tsx
msgid "Verify the code from the app"
@@ -17284,6 +17451,7 @@ msgid "Workflows"
msgstr "Ροές Εργασίας"
#. js-lingui-id: pmUArF
#: src/pages/settings/SettingsWorkspaceEmail.tsx
#: src/pages/settings/SettingsWorkspace.tsx
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
@@ -17315,6 +17483,7 @@ msgstr "Ροές Εργασίας"
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectDetailPage.tsx
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/pages/settings/data-model/new-index/SettingsObjectNewIndex.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx
#: src/pages/settings/data-model/new-field/SettingsObjectNewFieldConfigure.tsx
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -17436,11 +17605,6 @@ msgstr ""
msgid "Workspace views require manage views permission"
msgstr "Οι προβολές χώρου εργασίας απαιτούν δικαιώματα διαχείρισης προβολών"
#. js-lingui-id: 9Bn3vI
#: src/modules/settings/workspace/components/SettingsWorkspaceEmailGroupSection.tsx
msgid "Workspace-level shared addresses that receive forwarded mail."
msgstr ""
#. js-lingui-id: pmt7u4
#: src/pages/settings/admin-panel/SettingsAdminUserDetail.tsx
msgid "Workspaces"
@@ -17702,11 +17866,6 @@ msgstr "Οι δυνατότητες Enterprise θα απενεργοποιηθο
msgid "Your enterprise features will remain active until {cancelAtDate}."
msgstr "Οι δυνατότητες Enterprise θα παραμείνουν ενεργές έως {cancelAtDate}."
#. js-lingui-id: 5TsUUL
#: src/modules/information-banner/components/enterprise/InformationBannerInvalidEnterpriseKey.tsx
msgid "Your enterprise key is no longer valid. Activate a new key to continue using enterprise features."
msgstr ""
#. js-lingui-id: NTpA4U
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Your enterprise subscription has been canceled."

Some files were not shown because too many files have changed in this diff Show More