i18n - docs translations (#17261)
Created by Github action --------- Co-authored-by: github-actions <github-actions@twenty.com>
This commit is contained in:
committed by
GitHub
parent
cb4110e894
commit
6bc64f78fc
@@ -5364,15 +5364,15 @@
|
||||
"language": "tr",
|
||||
"tabs": [
|
||||
{
|
||||
"tab": "User Guide",
|
||||
"tab": "Kullanıcı Rehberi",
|
||||
"groups": [
|
||||
{
|
||||
"group": "Discover Twenty",
|
||||
"group": "Twenty'yi Keşfedin",
|
||||
"icon": "rocket",
|
||||
"pages": [
|
||||
"l/tr/user-guide/introduction",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/getting-started/capabilities/what-is-twenty",
|
||||
"l/tr/user-guide/getting-started/capabilities/implementation-services",
|
||||
@@ -5380,7 +5380,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/getting-started/how-tos/create-workspace",
|
||||
"l/tr/user-guide/getting-started/how-tos/navigate-around-twenty",
|
||||
@@ -5395,7 +5395,7 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-model/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-model/capabilities/objects",
|
||||
"l/tr/user-guide/data-model/capabilities/fields",
|
||||
@@ -5403,7 +5403,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-model/how-tos/create-custom-objects",
|
||||
"l/tr/user-guide/data-model/how-tos/create-custom-fields",
|
||||
@@ -5415,12 +5415,12 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Data Migration",
|
||||
"group": "Veri Geçişi",
|
||||
"icon": "cloud-arrow-up",
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-migration/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-migration/capabilities/file-formats",
|
||||
"l/tr/user-guide/data-migration/capabilities/field-mapping",
|
||||
@@ -5430,7 +5430,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/data-migration/how-tos/prepare-your-csv-files",
|
||||
"l/tr/user-guide/data-migration/how-tos/import-companies-via-csv",
|
||||
@@ -5447,19 +5447,19 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Calendar & Emails",
|
||||
"group": "Takvim ve E-postalar",
|
||||
"icon": "envelope",
|
||||
"pages": [
|
||||
"l/tr/user-guide/calendar-emails/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/calendar-emails/capabilities/mailbox",
|
||||
"l/tr/user-guide/calendar-emails/capabilities/calendar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user",
|
||||
"l/tr/user-guide/calendar-emails/how-tos/limit-emails-imported",
|
||||
@@ -5477,7 +5477,7 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/workflows/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/workflows/capabilities/workflow-triggers",
|
||||
"l/tr/user-guide/workflows/capabilities/workflow-actions",
|
||||
@@ -5491,10 +5491,10 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
{
|
||||
"group": "CRM Automations",
|
||||
"group": "CRM Otomasyonları",
|
||||
"pages": [
|
||||
"l/tr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due",
|
||||
"l/tr/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review",
|
||||
@@ -5506,7 +5506,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Connect to Other Tools",
|
||||
"group": "Diğer Araçlara Bağlan",
|
||||
"pages": [
|
||||
"l/tr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger",
|
||||
"l/tr/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty",
|
||||
@@ -5516,7 +5516,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Advanced Configurations",
|
||||
"group": "Gelişmiş Yapılandırmalar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions"
|
||||
]
|
||||
@@ -5539,7 +5539,7 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/ai/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/ai/capabilities/ai-chatbot",
|
||||
"l/tr/user-guide/ai/capabilities/ai-agents",
|
||||
@@ -5547,7 +5547,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/ai/how-tos/ai-faq"
|
||||
]
|
||||
@@ -5555,12 +5555,12 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Views & Pipelines",
|
||||
"group": "Görünümler ve Boru Hatları",
|
||||
"icon": "table",
|
||||
"pages": [
|
||||
"l/tr/user-guide/views-pipelines/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/views-pipelines/capabilities/table-views",
|
||||
"l/tr/user-guide/views-pipelines/capabilities/kanban-views",
|
||||
@@ -5571,7 +5571,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping",
|
||||
"l/tr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects",
|
||||
@@ -5590,7 +5590,7 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/dashboards/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/dashboards/capabilities/dashboards",
|
||||
"l/tr/user-guide/dashboards/capabilities/widgets",
|
||||
@@ -5598,7 +5598,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/dashboards/how-tos/dashboards-faq",
|
||||
"l/tr/user-guide/dashboards/how-tos/widget-faq"
|
||||
@@ -5607,19 +5607,19 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Permissions & Access",
|
||||
"group": "İzinler ve Erişim",
|
||||
"icon": "lock",
|
||||
"pages": [
|
||||
"l/tr/user-guide/permissions-access/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/permissions-access/capabilities/permissions",
|
||||
"l/tr/user-guide/permissions-access/capabilities/sso-configuration"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/permissions-access/how-tos/permissions-faq"
|
||||
]
|
||||
@@ -5632,14 +5632,14 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/billing/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/billing/capabilities/pricing-plans",
|
||||
"l/tr/user-guide/billing/capabilities/workflow-credits"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/billing/how-tos/billing-faq"
|
||||
]
|
||||
@@ -5652,7 +5652,7 @@
|
||||
"pages": [
|
||||
"l/tr/user-guide/settings/overview",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/user-guide/settings/capabilities/workspace-settings",
|
||||
"l/tr/user-guide/settings/capabilities/member-management",
|
||||
@@ -5663,7 +5663,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "How-Tos",
|
||||
"group": "Nasıl Yapılırlar",
|
||||
"pages": [
|
||||
"l/tr/user-guide/settings/how-tos/settings-faq"
|
||||
]
|
||||
@@ -5682,12 +5682,12 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Extend",
|
||||
"group": "Genişlet",
|
||||
"icon": "plug",
|
||||
"pages": [
|
||||
"l/tr/developers/extend/extend",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/developers/extend/capabilities/apis",
|
||||
"l/tr/developers/extend/capabilities/webhooks",
|
||||
@@ -5697,12 +5697,12 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Self-Host",
|
||||
"group": "Kendi Kendine Barındırma",
|
||||
"icon": "desktop",
|
||||
"pages": [
|
||||
"l/tr/developers/self-host/self-host",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/developers/self-host/capabilities/docker-compose",
|
||||
"l/tr/developers/self-host/capabilities/setup",
|
||||
@@ -5714,12 +5714,12 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Contribute",
|
||||
"group": "Katkıda Bulunun",
|
||||
"icon": "github",
|
||||
"pages": [
|
||||
"l/tr/developers/contribute/contribute",
|
||||
{
|
||||
"group": "Capabilities",
|
||||
"group": "Yetkinlikler",
|
||||
"pages": [
|
||||
"l/tr/developers/contribute/capabilities/local-setup",
|
||||
"l/tr/developers/contribute/capabilities/bug-and-requests",
|
||||
|
||||
@@ -35,6 +35,10 @@ description: أنشئ وأدِر تخصيصات Twenty على هيئة كود.
|
||||
npx create-twenty-app@latest my-twenty-app
|
||||
cd my-twenty-app
|
||||
|
||||
# If you don't use yarn@4
|
||||
corepack enable
|
||||
yarn install
|
||||
|
||||
# Authenticate using your API key (you'll be prompted)
|
||||
yarn auth:login
|
||||
|
||||
@@ -88,8 +92,6 @@ my-twenty-app/
|
||||
.nvmrc
|
||||
.yarnrc.yml
|
||||
.yarn/
|
||||
releases/
|
||||
yarn-4.9.2.cjs
|
||||
install-state.gz
|
||||
eslint.config.mjs
|
||||
tsconfig.json
|
||||
@@ -167,29 +169,43 @@ src/app/
|
||||
|
||||
ستضيف الأوامر اللاحقة مزيدًا من الملفات والمجلدات:
|
||||
|
||||
* `yarn app:generate` will create a `generated/` folder (typed Twenty client + workspace types).
|
||||
* `yarn app:create-entity` will add entity definition files under `src/app/` for your custom objects, functions, or roles.
|
||||
* `yarn app:generate` سيُنشئ مجلدًا `generated/` (عميل Twenty مضبوط الأنواع + أنواع مساحة العمل).
|
||||
* `yarn app:create-entity` سيضيف ملفات تعريف الكيانات تحت `src/app/` لكائناتك المخصصة أو الوظائف أو الأدوار.
|
||||
l
|
||||
|
||||
## المصادقة
|
||||
|
||||
The first time you run `yarn auth:login`, you'll be prompted for:
|
||||
في المرة الأولى التي تشغّل فيها `yarn auth:login`، سيُطلب منك إدخال:
|
||||
|
||||
* عنوان URL لواجهة برمجة التطبيقات (الافتراضي http://localhost:3000 أو ملف تعريف مساحة العمل الحالية لديك)
|
||||
* مفتاح واجهة برمجة التطبيقات
|
||||
|
||||
تُخزَّن بيانات اعتمادك لكل مستخدم في `~/.twenty/config.json`. يمكنك الاحتفاظ بملفات تعريف متعددة والتبديل باستخدام `--workspace <name>`.
|
||||
تُخزَّن بيانات اعتمادك لكل مستخدم في `~/.twenty/config.json`. You can maintain multiple profiles and switch between them.
|
||||
|
||||
الأمثلة:
|
||||
### Managing workspaces
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Login interactively (recommended)
|
||||
yarn auth:login
|
||||
|
||||
# Use a specific workspace profile
|
||||
# Login to a specific workspace profile
|
||||
yarn auth:login --workspace my-custom-workspace
|
||||
|
||||
# List all configured workspaces
|
||||
yarn auth:list
|
||||
|
||||
# Switch the default workspace (interactive)
|
||||
yarn auth:switch
|
||||
|
||||
# Switch to a specific workspace
|
||||
yarn auth:switch production
|
||||
|
||||
# Check current authentication status
|
||||
yarn auth:status
|
||||
```
|
||||
|
||||
Once you've switched workspaces with `auth:switch`, all subsequent commands will use that workspace by default. You can still override it temporarily with `--workspace <name>`.
|
||||
|
||||
## استخدم موارد SDK (الأنواع والتكوين)
|
||||
|
||||
يوفّر twenty-sdk كتلَ بناءٍ مضبوطة الأنواع ودوال مساعدة تستخدمها داخل تطبيقك. فيما يلي الأجزاء الأساسية التي ستتعامل معها غالبًا.
|
||||
@@ -286,7 +302,7 @@ export default defineObject({
|
||||
* `universalIdentifier` يجب أن يكون فريدًا وثابتًا عبر عمليات النشر.
|
||||
* يتطلب كل حقل `name` و`type` و`label` ومعرّف `universalIdentifier` ثابتًا خاصًا به.
|
||||
* المصفوفة `fields` اختيارية — يمكنك تعريف كائنات بدون حقول مخصصة.
|
||||
* You can scaffold new objects using `yarn app:create-entity`, which guides you through naming, fields, and relationships.
|
||||
* يمكنك إنشاء كائنات جديدة باستخدام `yarn app:create-entity`، والذي يرشدك خلال التسمية والحقول والعلاقات.
|
||||
|
||||
<Note>
|
||||
**يتم إنشاء الحقول الأساسية تلقائيًا.** عند تعريف كائن مخصص، يضيف Twenty تلقائيًا حقولًا قياسية مثل `name` و`createdAt` و`updatedAt` و`createdBy` و`position` و`deletedAt`. لا تحتاج إلى تعريف هذه في مصفوفة `fields` — أضف فقط حقولك المخصصة.
|
||||
@@ -514,21 +530,21 @@ export default defineFunction({
|
||||
> مثال: `path: '/post-card/create',` -> الاستدعاء على `<APP_URL>/s/post-card/create`
|
||||
|
||||
* **cron**: يشغّل وظيفتك على جدول باستخدام تعبير CRON.
|
||||
* **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.
|
||||
* **databaseEvent**: يعمل على أحداث دورة حياة كائنات مساحة العمل. عندما تكون عملية الحدث هي `updated`، يمكن تحديد الحقول المحددة المراد الاستماع إليها في مصفوفة `updatedFields`. إذا تُركت غير معرّفة أو فارغة، فسيؤدي أي تحديث إلى تشغيل الدالة.
|
||||
|
||||
> e.g. `person.updated`
|
||||
> مثال: `person.updated`
|
||||
|
||||
الملاحظات:
|
||||
|
||||
* المصفوفة `triggers` اختيارية. يمكن استخدام الوظائف بدون مشغلات كوظائف مساعدة تُستدعى بواسطة وظائف أخرى.
|
||||
* يمكنك مزج أنواع متعددة من المشغلات في وظيفة واحدة.
|
||||
|
||||
### Route trigger payload
|
||||
### حمولة مشغل المسار
|
||||
|
||||
<Warning>
|
||||
**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object.
|
||||
**تغيير غير متوافق (v1.16، يناير 2026):** لقد تغير تنسيق حمولة مشغل المسار. قبل v1.16، كانت معلمات الاستعلام، ومعلمات المسار، وجسم الطلب تُرسل مباشرةً كحمولة. بدءًا من v1.16، أصبحت متداخلة داخل كائن منظَّم `RoutePayload`.
|
||||
|
||||
**Before v1.16:**
|
||||
**قبل v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (params) => {
|
||||
@@ -536,7 +552,7 @@ export default defineFunction({
|
||||
};
|
||||
```
|
||||
|
||||
**After v1.16:**
|
||||
**بعد v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -546,10 +562,10 @@ export default defineFunction({
|
||||
};
|
||||
```
|
||||
|
||||
**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object.
|
||||
**لترحيل الدوال الحالية:** حدّث المعالج لديك لفكّ البنية من `event.body` أو `event.queryStringParameters` أو `event.pathParameters` بدلاً من القراءة مباشرةً من كائن params.
|
||||
</Warning>
|
||||
|
||||
When a route trigger invokes your function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`:
|
||||
عندما يستدعي مشغّل المسار دالتك، فإنه يتلقى كائنًا من النوع `RoutePayload` يتبع تنسيق AWS HTTP API v2. استورد النوع من `twenty-sdk`:
|
||||
|
||||
```typescript
|
||||
import { defineFunction, type RoutePayload } from 'twenty-sdk';
|
||||
@@ -565,21 +581,21 @@ const handler = async (event: RoutePayload) => {
|
||||
};
|
||||
```
|
||||
|
||||
The `RoutePayload` type has the following structure:
|
||||
يحتوي نوع `RoutePayload` على البنية التالية:
|
||||
|
||||
| Property | النوع | الوصف |
|
||||
| الخاصية | النوع | الوصف |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query string parameters (multiple values joined with commas) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
|
||||
| `المحتوى` | `object \| null` | Parsed request body (JSON) |
|
||||
| `isBase64Encoded` | `قيمة منطقية` | Whether the body is base64 encoded |
|
||||
| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Raw request path |
|
||||
| `headers` | `Record<string, string \| undefined>` | رؤوس HTTP (فقط تلك المدرجة في `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | معلمات سلسلة الاستعلام (تُضمّ القيم المتعددة باستخدام فواصل) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | معلمات المسار المستخرجة من نمط المسار (على سبيل المثال، `/users/:id` → `{ id: '123' }`) |
|
||||
| `المحتوى` | `object \| null` | جسم الطلب المُحلَّل (JSON) |
|
||||
| `isBase64Encoded` | `قيمة منطقية` | ما إذا كان جسم الطلب مُرمَّزًا بترميز base64 |
|
||||
| `requestContext.http.method` | `string` | طريقة HTTP (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | المسار الخام للطلب |
|
||||
|
||||
### Forwarding HTTP headers
|
||||
### تمرير رؤوس HTTP
|
||||
|
||||
By default, HTTP headers from incoming requests are **not** passed to your serverless function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array:
|
||||
افتراضيًا، لا يتم تمرير رؤوس HTTP من الطلبات الواردة إلى دالتك بدون خادم لأسباب أمنية. للوصول إلى رؤوس محددة، قم بإدراجها صراحةً في مصفوفة `forwardedRequestHeaders`:
|
||||
|
||||
```typescript
|
||||
export default defineFunction({
|
||||
@@ -599,7 +615,7 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
In your handler, you can then access these headers:
|
||||
في المعالج الخاص بك، يمكنك حينها الوصول إلى هذه الرؤوس:
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -612,17 +628,17 @@ const handler = async (event: RoutePayload) => {
|
||||
```
|
||||
|
||||
<Note>
|
||||
Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`).
|
||||
تُحوَّل أسماء الرؤوس إلى أحرف صغيرة. يمكنك الوصول إليها باستخدام مفاتيح بأحرف صغيرة (على سبيل المثال، `event.headers['content-type']`).
|
||||
</Note>
|
||||
|
||||
يمكنك إنشاء وظائف جديدة بطريقتين:
|
||||
|
||||
* **Scaffolded**: Run `yarn app:create-entity` and choose the option to add a new function. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين.
|
||||
* **مُنشأ بالقالب**: شغّل `yarn app:create-entity` واختر خيار إضافة وظيفة جديدة. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين.
|
||||
* **يدوي**: أنشئ ملفًا جديدًا `*.function.ts` واستخدم `defineFunction()` مع اتباع النمط نفسه.
|
||||
|
||||
### عميل مُولَّد مضبوط الأنواع
|
||||
|
||||
Run yarn app:generate to create a local typed client in generated/ based on your workspace schema. استخدمه في وظائفك:
|
||||
شغّل yarn app:generate لإنشاء عميل محلي مضبوط الأنواع في generated/ استنادًا إلى مخطط مساحة العمل لديك. استخدمه في وظائفك:
|
||||
|
||||
```typescript
|
||||
import Twenty from './generated';
|
||||
@@ -631,7 +647,7 @@ const client = new Twenty();
|
||||
const { me } = await client.query({ me: { id: true, displayName: true } });
|
||||
```
|
||||
|
||||
The client is re-generated by `yarn app:generate`. Re-run after changing your objects and `yarn app:sync` or when onboarding to a new workspace.
|
||||
يُعاد توليد العميل بواسطة `yarn app:generate`. أعِد تشغيله بعد تغيير كائناتك وتشغيل `yarn app:sync` أو عند الانضمام إلى مساحة عمل جديدة.
|
||||
|
||||
#### بيانات الاعتماد في وقت التشغيل في الوظائف بلا خادم
|
||||
|
||||
@@ -675,13 +691,13 @@ yarn add -D twenty-sdk
|
||||
}
|
||||
```
|
||||
|
||||
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:sync`, etc.
|
||||
يمكنك الآن تشغيل الأوامر نفسها عبر Yarn، مثل `yarn app:dev` و`yarn app:sync`، إلخ.
|
||||
|
||||
## استكشاف الأخطاء وإصلاحها
|
||||
|
||||
* Authentication errors: run `yarn auth:login` and ensure your API key has the required permissions.
|
||||
* أخطاء المصادقة: شغّل `yarn auth:login` وتأكد من أن مفتاح واجهة برمجة التطبيقات لديك يمتلك الأذونات المطلوبة.
|
||||
* يتعذّر الاتصال بالخادم: تحقق من عنوان URL لواجهة البرمجة وأن خادم Twenty قابل للوصول.
|
||||
* Types or client missing/outdated: run `yarn app:generate` and then `yarn app:dev`.
|
||||
* Dev mode not syncing: ensure `yarn app:dev` is running and that changes are not ignored by your environment.
|
||||
* الأنواع أو العميل مفقود/قديم: شغّل `yarn app:generate` ثم `yarn app:dev`.
|
||||
* وضع التطوير لا يزامن: تأكد من أن `yarn app:dev` قيد التشغيل وأن التغييرات ليست متجاهلة من بيئتك.
|
||||
|
||||
قناة المساعدة على Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
|
||||
@@ -292,31 +292,31 @@ yarn command:prod cron:workflow:automated-cron-trigger
|
||||
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
|
||||
</Warning>
|
||||
|
||||
## Serverless Functions
|
||||
## وظائف بلا خادم
|
||||
|
||||
Twenty supports serverless functions for workflows and custom logic. The execution environment is configured via the `SERVERLESS_TYPE` environment variable.
|
||||
تدعم Twenty وظائف بلا خادم لعمليات سير العمل والمنطق المخصص. يتم تكوين بيئة التنفيذ عبر متغير البيئة `SERVERLESS_TYPE`.
|
||||
|
||||
<Warning>
|
||||
**Security Notice:** The local serverless driver (`SERVERLESS_TYPE=LOCAL`) runs code directly on the host in a Node.js process with no sandboxing. It should only be used for trusted code in development. For production deployments handling untrusted code, we highly recommend using `SERVERLESS_TYPE=LAMBDA` or `SERVERLESS_TYPE=DISABLED`.
|
||||
**ملاحظة أمنية:** يقوم برنامج التشغيل المحلي لوظائف بلا خادم (`SERVERLESS_TYPE=LOCAL`) بتشغيل الشيفرة مباشرةً على المضيف ضمن عملية Node.js من دون عزل. يجب استخدامه فقط للشيفرة الموثوقة أثناء التطوير. بالنسبة لعمليات النشر الإنتاجية التي تتعامل مع شيفرة غير موثوق بها، نوصي بشدة باستخدام `SERVERLESS_TYPE=LAMBDA` أو `SERVERLESS_TYPE=DISABLED`.
|
||||
</Warning>
|
||||
|
||||
### Available Drivers
|
||||
### برامج التشغيل المتاحة
|
||||
|
||||
| Driver | Environment Variable | حالة الاستخدام | Security Level |
|
||||
| -------- | -------------------------- | ------------------------------------- | ------------------------------- |
|
||||
| Disabled | `SERVERLESS_TYPE=DISABLED` | Disable serverless functions entirely | N/A |
|
||||
| Local | `SERVERLESS_TYPE=LOCAL` | Development and trusted environments | Low (no sandboxing) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production with untrusted code | High (hardware-level isolation) |
|
||||
| برنامج التشغيل | متغير البيئة | حالة الاستخدام | مستوى الأمان |
|
||||
| -------------- | -------------------------- | ------------------------------- | ----------------------------- |
|
||||
| معطل | `SERVERLESS_TYPE=DISABLED` | تعطيل وظائف بلا خادم بالكامل | غير متاح |
|
||||
| محلي | `SERVERLESS_TYPE=LOCAL` | بيئات التطوير والبيئات الموثوقة | منخفض (من دون عزل) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | الإنتاج مع شيفرة غير موثوق بها | مرتفع (عزل على مستوى الأجهزة) |
|
||||
|
||||
### Recommended Configuration
|
||||
### التكوين الموصى به
|
||||
|
||||
**For development:**
|
||||
**للتطوير:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LOCAL # default
|
||||
```
|
||||
|
||||
**For production (AWS):**
|
||||
**للإنتاج (AWS):**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LAMBDA
|
||||
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
|
||||
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
|
||||
```
|
||||
|
||||
**To disable serverless functions:**
|
||||
**لتعطيل وظائف بلا خادم:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=DISABLED
|
||||
```
|
||||
|
||||
<Note>
|
||||
When using `SERVERLESS_TYPE=DISABLED`, any attempt to execute a serverless function will return an error. This is useful if you want to run Twenty without serverless function capabilities.
|
||||
عند استخدام `SERVERLESS_TYPE=DISABLED`، ستؤدي أي محاولة لتنفيذ وظيفة بلا خادم إلى إرجاع خطأ. يكون هذا مفيدًا إذا كنت ترغب في تشغيل Twenty من دون قدرات وظائف بلا خادم.
|
||||
</Note>
|
||||
|
||||
@@ -1,275 +1,275 @@
|
||||
---
|
||||
title: Chart Settings
|
||||
description: Configure your charts to display data exactly how you need it.
|
||||
title: إعدادات المخطط
|
||||
description: اضبط مخططاتك لعرض البيانات بالطريقة التي تحتاجها تمامًا.
|
||||
---
|
||||
|
||||
import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
## Accessing Chart Settings
|
||||
## الوصول إلى إعدادات المخطط
|
||||
|
||||
1. Click the **Edit** button in the top-right corner of your dashboard
|
||||
1. انقر زر **تحرير** في الزاوية العلوية اليمنى من لوحة المعلومات لديك
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Edit mode" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="وضع التحرير" />
|
||||
|
||||
2. The dashboard enters edit mode
|
||||
3. Click on any widget to select it
|
||||
4. The settings panel opens on the right
|
||||
2. تدخل لوحة المعلومات وضع التحرير
|
||||
3. انقر على أي عنصر واجهة لاختياره
|
||||
4. تُفتح لوحة الإعدادات على اليمين
|
||||
|
||||
Settings are organized into sections:
|
||||
تُنظَّم الإعدادات في أقسام:
|
||||
|
||||
* **Data**: What data to pull and how to filter it
|
||||
* **X axis**: How to group and sort categories (bar/line charts)
|
||||
* **Y axis**: What to measure and how to display it (bar/line charts)
|
||||
* **Style**: Colors, labels, and visual options
|
||||
* **البيانات**: ما البيانات التي سيتم جلبها وكيفية تصفيتها
|
||||
* **المحور X**: كيفية تجميع الفئات وفرزها (المخططات الشريطية/الخطية)
|
||||
* **المحور Y**: ما الذي سيتم قياسه وكيفية عرضه (المخططات الشريطية/الخطية)
|
||||
* **النمط**: الألوان، التسميات، والخيارات المرئية
|
||||
|
||||
<Note>
|
||||
Some settings only appear when other settings are configured. For example, **Date granularity** only appears when you select a date field.
|
||||
تظهر بعض الإعدادات فقط عند تهيئة إعدادات أخرى. على سبيل المثال، يظهر خيار **دقة التاريخ** فقط عند تحديد حقل تاريخ.
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
## Data Settings
|
||||
## إعدادات البيانات
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Source </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />المصدر </span>
|
||||
|
||||
Choose which object to pull data from.
|
||||
اختر الكائن الذي تريد جلب البيانات منه.
|
||||
|
||||
1. Click **Source**
|
||||
2. Select an object (Opportunities, People, Companies, etc.)
|
||||
1. انقر **المصدر**
|
||||
2. حدِّد كائنًا (الفرص، الأشخاص، الشركات، إلخ.)
|
||||
|
||||
All your standard and custom objects are available. Changing the source resets other settings since field options depend on the selected object.
|
||||
جميع كائناتك القياسية والمخصصة متاحة. يؤدي تغيير المصدر إلى إعادة تعيين الإعدادات الأخرى لأن خيارات الحقول تعتمد على الكائن المحدد.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-source.png" alt="المصدر" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filter </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />تصفية </span>
|
||||
|
||||
Limit which records are included in the chart.
|
||||
قيّد السجلات المضمّنة في المخطط.
|
||||
|
||||
1. انقر على **تصفية**
|
||||
2. The filter builder opens
|
||||
3. Click **+ Add filter**
|
||||
4. Select a field, condition, and value
|
||||
5. Add more filters as needed
|
||||
2. يُفتح مُنشئ عوامل التصفية
|
||||
3. انقر **+ إضافة عامل تصفية**
|
||||
4. حدِّد حقلًا وشرطًا وقيمة
|
||||
5. أضِف المزيد من عوامل التصفية حسب الحاجة
|
||||
|
||||
Filters work the same as in table views. Use them to focus on specific segments of your data.
|
||||
تعمل عوامل التصفية بالطريقة نفسها كما في عروض الجداول. استخدمها للتركيز على شرائح محددة من بياناتك.
|
||||
|
||||
**Example**: Filter opportunities where Stage equals "Won" to show only closed deals.
|
||||
**مثال**: صفِّ الفرص حيث المرحلة تساوي "Won" لإظهار الصفقات المغلقة فقط.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-filters.png" alt="تصفية" />
|
||||
|
||||
<Tip>
|
||||
For date fields, try **Is relative** to create dynamic filters like "Past 7 days" or "This month" that automatically update.
|
||||
بالنسبة لحقول التاريخ، جرّب **نسبي** لإنشاء عوامل تصفية ديناميكية مثل "آخر 7 أيام" أو "هذا الشهر" التي تتحدّث تلقائيًا.
|
||||
</Tip>
|
||||
|
||||
<Tip>
|
||||
Advanced filters are supported—add multiple filter rules and combine them with **And** or **Or** logic.
|
||||
تُدعم عوامل التصفية المتقدمة—أضِف قواعد تصفية متعددة وادمجها بمنطق **و** أو **أو**.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## X Axis Settings
|
||||
## إعدادات المحور X
|
||||
|
||||
These settings control the horizontal axis of bar and line charts—typically how your data is grouped into categories.
|
||||
تتحكم هذه الإعدادات في المحور الأفقي للمخططات الشريطية والخطية—وعادةً في كيفية تجميع بياناتك ضمن فئات.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />البيانات المعروضة </span>
|
||||
|
||||
Select the field to group your data by. This determines the categories shown on the X axis.
|
||||
اختر الحقل لتجميع بياناتك بحسبه. هذا يحدد الفئات المعروضة على المحور X.
|
||||
|
||||
**Example**: Select "Stage" to see data grouped by pipeline stage, or "Created date" to see data over time.
|
||||
**مثال**: اختر "Stage" لرؤية البيانات مُجمَّعة حسب مرحلة خط الأنابيب، أو "Created date" لرؤية البيانات عبر الزمن.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-data-on-display.png" alt="البيانات المعروضة" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />دقة التاريخ </span>
|
||||
|
||||
When grouping by a date field, choose the time period for grouping.
|
||||
عند التجميع حسب حقل تاريخ، اختر الفترة الزمنية للتجميع.
|
||||
|
||||
| الخيار | Groups data by | Example output |
|
||||
| ------------------- | -------------------- | --------------------------------------------- |
|
||||
| **Day** | Each calendar day | Jan 1, Jan 2, Jan 3... |
|
||||
| **Week** | Calendar weeks | Week 1, Week 2, Week 3... |
|
||||
| **Month** | Calendar months | January, February, March... |
|
||||
| **Quarter** | Fiscal quarters | Q1, Q2, Q3, Q4 |
|
||||
| **Year** | Calendar years | 2023, 2024, 2025 |
|
||||
| **Day of week** | Weekday (aggregated) | Monday, Tuesday... (all Mondays combined) |
|
||||
| **Month of year** | Month (aggregated) | January, February... (all Januaries combined) |
|
||||
| **Quarter of year** | Quarter (aggregated) | Q1, Q2, Q3, Q4 (all Q1s combined) |
|
||||
| الخيار | يُجمِّع البيانات حسب | مثال على المخرجات |
|
||||
| ------------------ | --------------------------- | -------------------------------------------------------- |
|
||||
| **يوم** | كل يوم تقويمي | 1 يناير، 2 يناير، 3 يناير... |
|
||||
| **أسبوع** | أسابيع التقويم | الأسبوع 1، الأسبوع 2، الأسبوع 3... |
|
||||
| **شهر** | أشهر التقويم | يناير، فبراير، مارس... |
|
||||
| **ربع** | أرباع السنة المالية | الربع 1، الربع 2، الربع 3، الربع 4 |
|
||||
| **عام** | سنوات التقويم | 2023، 2024، 2025 |
|
||||
| **يوم من الأسبوع** | يوم من أيام الأسبوع (مجمّع) | الاثنين، الثلاثاء... (جميع أيام الاثنين مجتمعة) |
|
||||
| **شهر من السنة** | شهر (مجمّع) | يناير، فبراير... (جميع أشهر يناير مجتمعة) |
|
||||
| **ربع من السنة** | ربع (مجمّع) | الربع 1، الربع 2، الربع 3، الربع 4 (جميع الربع 1 مجتمعة) |
|
||||
|
||||
The "of week/year" options aggregate across all time. Use **Day of week** to see which weekday typically gets the most deals. Use **Month** to see trends month by month.
|
||||
تُجمِّع خيارات "من الأسبوع/من السنة" عبر كل الوقت. استخدم **يوم من الأسبوع** لمعرفة أي يوم عادةً يحقق أكبر عدد من الصفقات. استخدم **شهر** لرؤية الاتجاهات شهرًا بشهر.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />الفرز حسب </span>
|
||||
|
||||
Control the order of categories on the X axis.
|
||||
تحكّم بترتيب الفئات على المحور X.
|
||||
|
||||
* **Position** – Uses the order defined in your Select field settings
|
||||
* **Alphabetical** – A to Z (or chronological for dates)
|
||||
* **By value** – Ordered by the metric (highest or lowest first)
|
||||
* **Manual** – Drag to set your own order
|
||||
* **الموضع** – يستخدم الترتيب المحدد في إعدادات حقل الاختيار
|
||||
* **أبجديًا** – من A إلى Z (أو ترتيبًا زمنيًا للتواريخ)
|
||||
* **حسب القيمة** – يُرتَّب بحسب المقياس (الأعلى أو الأدنى أولًا)
|
||||
* **يدوي** – اسحب لضبط ترتيبك الخاص
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-sort.png" alt="الترتيب حسب" />
|
||||
|
||||
**Tip**: For pipeline stages, use **Position** to show stages in your sales process order (Lead → Qualified → Proposal → Won).
|
||||
**نصيحة**: لمراحل خط الأنابيب، استخدم **الموضع** لعرض المراحل بترتيب عملية المبيعات لديك (Lead → Qualified → Proposal → Won).
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field type. Select fields have all options; date and text fields show fewer.
|
||||
تعتمد الخيارات المعروضة على نوع الحقل لديك. حقول الاختيار تتضمن جميع الخيارات؛ حقول التاريخ والنص تعرض خيارات أقل.
|
||||
</Note>
|
||||
|
||||
<Tip>
|
||||
With **Manual** sorting, drag categories to create a custom order—perfect for highlighting specific segments or telling a story with your data.
|
||||
مع الفرز **اليدوي**، اسحب الفئات لإنشاء ترتيب مخصص—مناسب تمامًا لإبراز شرائح محددة أو سرد قصة ببياناتك.
|
||||
</Tip>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Omit zero values </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />تجاهل القيم الصفرية </span>
|
||||
|
||||
Hide categories that have zero or no data.
|
||||
أخفِ الفئات التي قيمتها صفر أو التي لا تحتوي بيانات.
|
||||
|
||||
* **On**: Categories with no records are hidden
|
||||
* **Off**: All categories are shown, even if empty
|
||||
* **تشغيل**: تُخفى الفئات التي لا تحتوي على سجلات
|
||||
* **إيقاف**: تُعرض جميع الفئات حتى لو كانت فارغة
|
||||
|
||||
Use this to clean up charts with sparse data.
|
||||
استخدم هذا لتنظيف المخططات ذات البيانات المتناثرة.
|
||||
|
||||
---
|
||||
|
||||
## Y Axis Settings
|
||||
## إعدادات المحور Y
|
||||
|
||||
These settings control what you're measuring and how it's displayed.
|
||||
تتحكم هذه الإعدادات في ما تقوم بقياسه وكيفية عرضه.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />البيانات المعروضة </span>
|
||||
|
||||
Select the field and operation to calculate your metric.
|
||||
اختر الحقل والعملية لحساب مقياسك.
|
||||
|
||||
* **Counts** – Count all, Count empty, Count not empty, Count unique values
|
||||
* **Math** – Sum, Average, Min, Max (number fields)
|
||||
* **Percentages** – Percent empty, Percent not empty
|
||||
* **العدد** – عدّ الكل، عدّ الفارغ، عدّ غير الفارغ، عدّ القيم الفريدة
|
||||
* **الرياضيات** – المجموع، المتوسط، الحد الأدنى، الحد الأقصى (حقول الأرقام)
|
||||
* **النِّسَب المئوية** – نسبة الفارغ، نسبة غير الفارغ
|
||||
|
||||
Boolean fields add Count true/false. Aggregate charts with date fields show Earliest/Latest.
|
||||
تضيف حقول القيم المنطقية عدّ true/false. تُظهر المخططات التجميعية مع حقول التاريخ الأقدم/الأحدث.
|
||||
|
||||
**Example**: Select "Amount" with Sum to see total deal value per category, or Count all to see number of deals.
|
||||
**مثال**: اختر "Amount" مع المجموع لرؤية إجمالي قيمة الصفقة لكل فئة، أو عدّ الكل لرؤية عدد الصفقات.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-data-on-display.png" alt="البيانات المعروضة" />
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field and chart type. If you don't see an expected operation, check your field type.
|
||||
تعتمد الخيارات المعروضة على نوع الحقل ونوع المخطط. إذا لم تر العملية المتوقعة، فتحقّق من نوع الحقل.
|
||||
</Note>
|
||||
|
||||
### النسبة
|
||||
|
||||
For Select, Multi-select, or Boolean fields, you can calculate the percentage of a specific value.
|
||||
بالنسبة لحقول الاختيار، ومتعدد الاختيار، أو القيم المنطقية، يمكنك حساب نسبة قيمة محددة.
|
||||
|
||||
1. Select a Select, Multi-select, or Boolean field
|
||||
2. Enable **Ratio**
|
||||
3. Choose the option to measure
|
||||
1. اختر حقل اختيار، أو متعدد الاختيار، أو حقلًا منطقيًا
|
||||
2. فعِّل **النسبة**
|
||||
3. اختر الخيار المراد قياسه
|
||||
|
||||
**Example**: Show "Won" deals as a percentage of all opportunities. If you have 10 Won out of 50 total, the chart shows 20%.
|
||||
**مثال**: اعرض الصفقات "Won" كنسبة مئوية من جميع الفرص. إذا كان لديك 10 "Won" من أصل 50 إجمالًا، فسيعرض المخطط 20٪.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Group by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />التجميع حسب </span>
|
||||
|
||||
Add a second dimension to create multiple series (multiple bars or lines).
|
||||
أضِف بُعدًا ثانيًا لإنشاء عدة سلاسل (عدة أشرطة أو خطوط).
|
||||
|
||||
1. Set your X axis field first
|
||||
2. Click **Group by**
|
||||
3. Select a second field
|
||||
1. عيّن حقل المحور X أولًا
|
||||
2. انقر **التجميع حسب**
|
||||
3. اختر حقلًا ثانيًا
|
||||
|
||||
**Example**: Group deals by Stage (X axis) AND by Owner (Group by) to see each person's pipeline breakdown side by side.
|
||||
**مثال**: جمِّع الصفقات حسب المرحلة (المحور X) وأيضًا حسب المالك (التجميع حسب) لرؤية تفصيل خط الأنابيب لكل شخص جنبًا إلى جنب.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-group-by.png" alt="التجميع حسب" />
|
||||
|
||||
When Group by is set, you'll see multiple colors in your chart and a legend appears.
|
||||
عند تعيين التجميع حسب، سترى ألوانًا متعددة في مخططك وستظهر وسيلة إيضاح.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />دقة التاريخ </span>
|
||||
|
||||
When Group by is a date field, choose the time period (same options as X axis).
|
||||
عندما يكون التجميع حسب حقل تاريخ، اختر الفترة الزمنية (نفس خيارات المحور X).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />الفرز حسب </span>
|
||||
|
||||
When **Group by** is set, control the order of grouped series (e.g., which owner's bar appears first within each category).
|
||||
عند تفعيل **التجميع حسب**، تحكّم بترتيب السلاسل المجمّعة (مثلًا، أي شريط للمالك يظهر أولًا ضمن كل فئة).
|
||||
|
||||
Same options as X axis sorting—Position, Alphabetical, and Manual—except **value-based sorting is not available** for secondary grouping.
|
||||
نفس خيارات فرز المحور X—الموضع، أبجديًا، ويدوي—باستثناء أن **الفرز حسب القيمة غير متاح** للتجميع الثانوي.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Cumulative </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />تراكمي </span>
|
||||
|
||||
Show running totals instead of individual values.
|
||||
اعرض المجاميع التراكمية بدلًا من القيم الفردية.
|
||||
|
||||
* **Off**: Each bar/point shows its own value
|
||||
* **On**: Each bar/point shows the sum of all previous values plus its own
|
||||
* **إيقاف**: يُظهر كل شريط/نقطة قيمته الخاصة
|
||||
* **تشغيل**: يُظهر كل شريط/نقطة مجموع جميع القيم السابقة مضافًا إليها قيمته
|
||||
|
||||
**Example**: January = 10, February = 15
|
||||
**مثال**: يناير = 10، فبراير = 15
|
||||
|
||||
* Cumulative off: Shows 10 and 15
|
||||
* Cumulative on: Shows 10 and 25 (10 + 15)
|
||||
* التراكمي متوقف: يُظهر 10 و15
|
||||
* التراكمي مفعّل: يُظهر 10 و25 (10 + 15)
|
||||
|
||||
Use cumulative to track progress toward a goal over time.
|
||||
استخدم التراكمي لتتبُّع التقدم نحو هدف عبر الزمن.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-cumulative.png" alt="تراكمي" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min range / <ChartIcon icon="math-max" />Max range </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />المدى الأدنى / <ChartIcon icon="math-max" />المدى الأقصى </span>
|
||||
|
||||
Set fixed minimum and maximum values for the Y axis.
|
||||
عيّن قيمًا دنيا وعظمى ثابتة للمحور Y.
|
||||
|
||||
* Leave blank for automatic scaling
|
||||
* Enter a number to fix the boundary
|
||||
* اتركه فارغًا للتحجيم التلقائي
|
||||
* أدخل رقمًا لتثبيت الحد
|
||||
|
||||
**When to use:**
|
||||
**متى يُستخدم:**
|
||||
|
||||
* Set Min to 0 for accurate visual comparisons
|
||||
* Set both for consistent scales across multiple charts
|
||||
* Focus on a specific value range by setting both
|
||||
* عيّن الحد الأدنى إلى 0 للحصول على مقارنات مرئية دقيقة
|
||||
* عيّن كليهما للحصول على مقاييس متسقة عبر عدة مخططات
|
||||
* ركّز على نطاق قيم محدد بتعيين كليهما
|
||||
|
||||
---
|
||||
|
||||
## Style Settings
|
||||
## إعدادات النمط
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Colors </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />الألوان </span>
|
||||
|
||||
Set the color scheme for your chart. Choose from a variety of color palettes.
|
||||
عيّن نظام الألوان لمخططك. اختر من مجموعة متنوعة من لوحات الألوان.
|
||||
|
||||
<Note>
|
||||
When grouping by a Select field, the chart automatically uses the colors defined for each option in your field settings.
|
||||
عند التجميع حسب حقل اختيار، يستخدم المخطط تلقائيًا الألوان المحددة لكل خيار في إعدادات الحقل لديك.
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Axis name </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />اسم المحور </span>
|
||||
|
||||
Choose which axis labels to show: **None**, **X axis**, **Y axis**, or **Both** (bar and line charts only).
|
||||
اختر تسميات المحاور المراد عرضها: **لا شيء**، **المحور X**، **المحور Y**، أو **كلاهما** (للمخططات الشريطية والخطية فقط).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Stacked bars / Stacked lines </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />أشرطة مكدّسة / خطوط مكدّسة </span>
|
||||
|
||||
When Group by is set, choose how multiple series are displayed.
|
||||
عند تعيين التجميع حسب، اختر كيفية عرض السلاسل المتعددة.
|
||||
|
||||
* **Off (Grouped)**: Series appear side by side. Use when comparing exact values between groups.
|
||||
* **On (Stacked)**: Series stack on top of each other. Use when showing composition—how parts make up a whole.
|
||||
* **إيقاف (مجمّعة)**: تظهر السلاسل جنبًا إلى جنب. استخدم عند مقارنة القيم الدقيقة بين المجموعات.
|
||||
* **تشغيل (مكدّسة)**: تتكدس السلاسل فوق بعضها. استخدم عند إظهار التركيب—كيف تتكوّن الأجزاء لتشكّل الكل.
|
||||
|
||||
**Example**: Deals by stage, grouped by owner
|
||||
**مثال**: صفقات حسب المرحلة، مُجمّعة حسب المالك
|
||||
|
||||
* Grouped: See each owner's exact numbers side by side
|
||||
* Stacked: See total deals per stage, with each owner's contribution stacked
|
||||
* مجمّعة: شاهد الأرقام الدقيقة لكل مالك جنبًا إلى جنب
|
||||
* مكدّسة: شاهد إجمالي الصفقات لكل مرحلة، مع مساهمة كل مالك مكدّسة
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Data labels </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />تسميات البيانات </span>
|
||||
|
||||
Show values directly on chart elements (bars, points, slices).
|
||||
اعرض القيم مباشرة على عناصر المخطط (الأشرطة، النقاط، الشرائح).
|
||||
|
||||
* **On**: Values appear on the chart
|
||||
* **Off**: No values shown (cleaner look)
|
||||
* **تشغيل**: تظهر القيم على المخطط
|
||||
* **إيقاف**: لا تُعرض قيم (مظهر أنظف)
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legend </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />وسيلة الإيضاح </span>
|
||||
|
||||
Show or hide the legend (only appears when Group by is set).
|
||||
إظهار أو إخفاء وسيلة الإيضاح (تظهر فقط عند تعيين التجميع حسب).
|
||||
|
||||
* **On**: Legend shows what each color represents
|
||||
* **Off**: No legend displayed
|
||||
* **تشغيل**: تعرض وسيلة الإيضاح ما يمثله كل لون
|
||||
* **إيقاف**: لا تُعرض وسيلة إيضاح
|
||||
|
||||
<Tip>
|
||||
**Hover** over a legend item to highlight that group. **Click** to temporarily hide it from the chart.
|
||||
**مرّر المؤشر** فوق عنصر في وسيلة الإيضاح لإبراز تلك المجموعة. **انقر** لإخفائه مؤقتًا من المخطط.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## Chart-Specific Notes
|
||||
## ملاحظات خاصة بالمخطط
|
||||
|
||||
### مخططات دائرية
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Each slice represents** – Define how slices are grouped
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Hide empty category** – Remove zero-value slices
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Show value in center** – Display the aggregate value (sum, average, count, etc.)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **تمثل كل شريحة** – حدِّد كيفية تجميع الشرائح
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **إخفاء الفئة الفارغة** – إزالة الشرائح ذات القيمة الصفرية
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **إظهار القيمة في الوسط** – عرض القيمة المجمّعة (المجموع، المتوسط، العدّ، إلخ.)
|
||||
|
||||
### Aggregate charts
|
||||
### مخططات التجميع
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Add text before the number (e.g., `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Add text after the number (e.g., `%`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **بادئة** – أضِف نصًا قبل الرقم (مثلًا، "$")
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **لاحقة** – أضِف نصًا بعد الرقم (مثلًا، "%")
|
||||
|
||||
@@ -12,7 +12,7 @@ description: أنشئ ونظّم لوحات المعلومات باستخدام
|
||||
1. انتقل إلى **لوحات المعلومات** في شريط التنقل
|
||||
2. انقر **+ سجل جديد**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Create a new dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="إنشاء لوحة تحكم جديدة" />
|
||||
|
||||
3. امنح لوحة المعلومات اسمًا
|
||||
4. ابدأ بإضافة علامات تبويب وعناصر واجهة مستخدم
|
||||
@@ -23,27 +23,27 @@ description: أنشئ ونظّم لوحات المعلومات باستخدام
|
||||
|
||||
### إنشاء علامات تبويب
|
||||
|
||||
1. In edit mode, click **+** in the tab bar, side panel will open on the right
|
||||
1. في وضع التحرير، انقر على **+** في شريط علامات التبويب، ستفتح اللوحة الجانبية على اليمين
|
||||
2. قم بتسمية علامة التبويب (مثل: "نظرة عامة على خط المبيعات"، "أداء الفريق")
|
||||
3. أضف عناصر واجهة مستخدم إلى علامة التبويب
|
||||
|
||||
### Reordering Tabs
|
||||
### إعادة ترتيب علامات التبويب
|
||||
|
||||
1. In edit mode, click and hold on the tab you want to move
|
||||
2. Drag and drop to the new position
|
||||
3. You can also click on the tab and use the command menu to move the tab to left or right
|
||||
1. في وضع التحرير، انقر مع الاستمرار على علامة التبويب التي تريد نقلها
|
||||
2. اسحب وأفلت إلى الموضع الجديد
|
||||
3. يمكنك أيضًا النقر على علامة التبويب واستخدام قائمة الأوامر لنقل علامة التبويب إلى اليسار أو اليمين
|
||||
|
||||
### Deleting Tabs
|
||||
### حذف علامات التبويب
|
||||
|
||||
1. In edit mode, click on the tab you want to delete
|
||||
2. Click the **Delete** button in the command menu
|
||||
1. في وضع التحرير، انقر على علامة التبويب التي تريد حذفها
|
||||
2. انقر على زر **حذف** في قائمة الأوامر
|
||||
|
||||
### تكرار علامات التبويب
|
||||
|
||||
1. انقر على علامة التبويب التي تريد تكرارها
|
||||
2. انقر على زر **تكرار** في اللوحة الجانبية
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Dashboard tab" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="علامة تبويب لوحة التحكم" />
|
||||
|
||||
## تخطيط لوحة المعلومات
|
||||
|
||||
@@ -55,11 +55,11 @@ description: أنشئ ونظّم لوحات المعلومات باستخدام
|
||||
|
||||
### تكرار لوحة معلومات
|
||||
|
||||
1. Select the dashboard you want to duplicate
|
||||
1. حدِّد لوحة التحكم التي تريد تكرارها
|
||||
2. افتح شريط الأوامر باستخدام **Cmd + K** (أو **Ctrl + K** على Windows)
|
||||
3. اختر **تكرار لوحة المعلومات**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplicate a dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="تكرار لوحة التحكم" />
|
||||
|
||||
### أفضل الممارسات
|
||||
|
||||
|
||||
@@ -9,12 +9,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
يوفّر Twenty أنواعًا متعددة من الأدوات لتصوُّر بيانات إدارة علاقات العملاء (CRM).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Bar Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />مخططات الأعمدة</span>
|
||||
|
||||
اعرض البيانات كأعمدة أفقية أو عمودية.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Bar chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="مخطط أعمدة" />
|
||||
</Frame>
|
||||
|
||||
**الأفضل لـ:**
|
||||
@@ -30,15 +30,15 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
* جهات الاتصال المضافة شهريًا
|
||||
|
||||
<Note>
|
||||
**Display limits**: Bar charts can show a maximum of 100 bars, and 50 groups per bar when using Group By. إذا ظهرت لك رسالة التحذير "بيانات غير معروضة: الحد الأقصى X عمودًا لكل مخطط"، فأضِف عوامل تصفية لتضييق نطاق بياناتك أو غيّر أسلوب التجميع (على سبيل المثال، اجعل التجميع حسب الأسبوع بدلًا من الأيام).
|
||||
**حدود العرض**: يمكن لمخططات الأعمدة عرض حد أقصى يبلغ 100 عمود، و50 مجموعة لكل عمود عند استخدام "Group By". إذا ظهرت لك رسالة التحذير "بيانات غير معروضة: الحد الأقصى X عمودًا لكل مخطط"، فأضِف عوامل تصفية لتضييق نطاق بياناتك أو غيّر أسلوب التجميع (على سبيل المثال، اجعل التجميع حسب الأسبوع بدلًا من الأيام).
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Pie Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />مخططات دائرية</span>
|
||||
|
||||
اعرض نسب الأجزاء من الكل.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Pie chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="مخطط دائري" />
|
||||
</Frame>
|
||||
|
||||
**الأفضل لـ:**
|
||||
@@ -53,12 +53,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
* تفصيل جهات الاتصال حسب الصناعة
|
||||
* تركيب مسار المبيعات حسب المالك
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Line Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />مخططات خطية</span>
|
||||
|
||||
اعرض الاتجاهات مع مرور الوقت.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Line chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="مخطط خطي" />
|
||||
</Frame>
|
||||
|
||||
**الأفضل لـ:**
|
||||
@@ -73,12 +73,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
* نمو الإيرادات على مدى الأرباع السنوية
|
||||
* مستويات النشاط مع مرور الوقت
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Aggregate Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />مخططات تجميعية</span>
|
||||
|
||||
اعرض القيم الأساسية المفردة بشكل بارز.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Aggregate chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="مخطط تجميعي" />
|
||||
</Frame>
|
||||
|
||||
**الأفضل لـ:**
|
||||
@@ -118,25 +118,25 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
* مقاييس من أداة الاتصال الهاتفي لديك
|
||||
* محتوى مباشر من أداة تسلسل المبيعات لديك
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Rich Text</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />نص منسق</span>
|
||||
|
||||
Add formatted text and content directly to your dashboard.
|
||||
أضف نصًا منسقًا ومحتوى مباشرةً إلى لوحة المعلومات الخاصة بك.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Rich text" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="نص منسق" />
|
||||
</Frame>
|
||||
|
||||
**الأفضل لـ:**
|
||||
|
||||
* Adding context or instructions
|
||||
* Dashboard descriptions
|
||||
* Notes and annotations
|
||||
* إضافة سياق أو إرشادات
|
||||
* أوصاف لوحة المعلومات
|
||||
* الملاحظات والتعليقات التوضيحية
|
||||
|
||||
**Features:**
|
||||
**الميزات:**
|
||||
|
||||
* Rich text formatting (bold, italic, lists, etc.)
|
||||
* Image and file uploads
|
||||
* Markdown-style editing
|
||||
* تنسيق النص المنسق (عريض، مائل، قوائم، إلخ.)
|
||||
* رفع الصور والملفات
|
||||
* تحرير بأسلوب Markdown
|
||||
|
||||
<Note>
|
||||
**قريبًا**: مخططات القياس والجداول غير متاحة بعد ولكنها على خريطة الطريق لدينا.
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
---
|
||||
title: Widget FAQ
|
||||
description: Common questions and error messages explained.
|
||||
title: الأسئلة الشائعة حول الأداة
|
||||
description: شرح الأسئلة الشائعة ورسائل الخطأ.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="How do I show percentages instead of counts?">
|
||||
Three options:
|
||||
<Accordion title="كيف أعرض النسب المئوية بدلًا من الأعداد؟">
|
||||
ثلاثة خيارات:
|
||||
|
||||
* **Percent empty/not empty**: Under Data on display, select Percent empty or Percent not empty
|
||||
* **Ratio**: For Select or Checkbox fields, enable Ratio to show a specific option as a percentage of all records
|
||||
* **Suffix**: For aggregate charts, add `%` as a Suffix in Style settings
|
||||
* **نسبة القيم الفارغة/غير الفارغة**: ضمن بيانات العرض، اختر نسبة القيم الفارغة أو نسبة القيم غير الفارغة
|
||||
* **النسبة**: لحقول الاختيار أو خانات الاختيار، فعّل خيار النسبة لعرض خيار معيّن كنسبة مئوية من جميع السجلات
|
||||
* **اللاحقة**: بالنسبة للمخططات التجميعية، أضف `%` كلاحقة في إعدادات النمط
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between grouped and stacked bars?">
|
||||
When using **Group by**, you can display series two ways:
|
||||
<Accordion title="ما الفرق بين الأعمدة المجمعة والمكدسة؟">
|
||||
عند استخدام **التجميع حسب**، يمكنك عرض السلاسل بطريقتين:
|
||||
|
||||
* **Grouped**: Bars side by side—best for comparing exact values
|
||||
* **Stacked**: Bars on top of each other—best for showing composition
|
||||
* **مجمعة**: أعمدة جنبًا إلى جنب—الأفضل للمقارنة بين القيم الدقيقة
|
||||
* **مكدسة**: أعمدة فوق بعضها—الأفضل لإظهار التركيب
|
||||
|
||||
Toggle **Stacked** in Style settings to switch.
|
||||
بدّل خيار **مكدسة** في إعدادات النمط.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why can't I see Sum or Average options?">
|
||||
Available operations depend on **field type**:
|
||||
<Accordion title="لماذا لا أرى خيارات المجموع أو المتوسط؟">
|
||||
تعتمد العمليات المتاحة على **نوع الحقل**:
|
||||
|
||||
* **Number fields**: Sum, Average, Min, Max
|
||||
* **Date fields**: Earliest, Latest (aggregate charts only)
|
||||
* **Checkbox fields**: Count true, Count false
|
||||
* **حقول الأرقام**: المجموع، المتوسط، الحد الأدنى، الحد الأقصى
|
||||
* **حقول التاريخ**: الأقدم، الأحدث (للمخططات التجميعية فقط)
|
||||
* **حقول خانات الاختيار**: عدّ 'صحيح'، عدّ 'خطأ'
|
||||
|
||||
If you don't see an option, check that you've selected a compatible field type.
|
||||
إذا لم ترَ خيارًا، فتحقق من أنك اخترت نوع حقل متوافقًا.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why are some settings grayed out or missing?">
|
||||
Many settings only appear when prerequisites are met:
|
||||
<Accordion title="لماذا تكون بعض الإعدادات باللون الرمادي أو مفقودة؟">
|
||||
تظهر العديد من الإعدادات فقط عند استيفاء المتطلبات المسبقة:
|
||||
|
||||
* **Date granularity**: Select a date field first
|
||||
* **Group by, Legend, Stacked**: Set Source first
|
||||
* **Legend, Stacked toggles**: Set Group by first
|
||||
* **دقة التاريخ**: حدد حقل تاريخ أولاً
|
||||
* **التجميع حسب، وسيلة الإيضاح، مكدسة**: عيّن المصدر أولاً
|
||||
* **أزرار تبديل وسيلة الإيضاح ومكدسة**: عيّن التجميع حسب أولاً
|
||||
|
||||
If a setting is missing, configure its prerequisite first.
|
||||
إذا كان إعداد مفقودًا، فقم بإعداد المتطلب المسبق له أولاً.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'No data' mean?">
|
||||
The chart found no records matching your configuration.
|
||||
<Accordion title="ماذا يعني 'No data'؟">
|
||||
لم يعثر المخطط على سجلات مطابقة لإعداداتك.
|
||||
|
||||
**To fix:** Remove or adjust filters, verify you selected the correct Source object, or check that records exist for your date range.
|
||||
**للحل:** أزل أو اضبط عوامل التصفية، وتحقق من أنك اخترت كائن المصدر الصحيح، أو تحقق من وجود سجلات لنطاق التاريخ الخاص بك.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Invalid configuration' mean?">
|
||||
A required setting is missing or incompatible.
|
||||
<Accordion title="ماذا يعني 'Invalid configuration'؟">
|
||||
يوجد إعداد مطلوب مفقود أو غير متوافق.
|
||||
|
||||
**To fix:** Ensure Source is set, Data on display is configured, and any required grouping fields are selected.
|
||||
**للحل:** تأكد من تعيين المصدر، وتكوين بيانات العرض، وتحديد أي حقول تجميع مطلوبة.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Undisplayed data' mean?">
|
||||
Your data exceeds display limits (100 bars, 100 data points, or 100 slices).
|
||||
<Accordion title="ماذا يعني 'Undisplayed data'؟">
|
||||
تتجاوز بياناتك حدود العرض (100 عمود، 100 نقطة بيانات، أو 100 شريحة).
|
||||
|
||||
**To fix:** Add filters to narrow your data, or change date granularity from Day to Week or Month.
|
||||
**للحل:** أضف عوامل تصفية لتضييق نطاق بياناتك، أو غيّر دقة التاريخ من يوم إلى أسبوع أو شهر.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why is one axis showing no data?">
|
||||
The selected field has no values for the records in your filter, or the field type doesn't match the expected data.
|
||||
<Accordion title="لماذا لا يعرض أحد المحورين أي بيانات؟">
|
||||
لا يحتوي الحقل المحدد على قيم للسجلات ضمن عامل التصفية لديك، أو أن نوع الحقل لا يطابق البيانات المتوقعة.
|
||||
|
||||
**To fix:** Try a different field, or check that records have values for the selected field.
|
||||
**للحل:** جرّب حقلًا آخر، أو تحقق من أن السجلات تحتوي على قيم للحقل المحدد.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -40,9 +40,9 @@ image: /images/user-guide/reporting/pie-chart.png
|
||||
* مخططات الأعمدة
|
||||
* مخططات دائرية
|
||||
* مخططات خطية
|
||||
* Aggregate charts
|
||||
* مخططات التجميع
|
||||
* iFrames
|
||||
* Rich text
|
||||
* نص منسق
|
||||
|
||||
<Note>
|
||||
**القيود الحالية**:
|
||||
@@ -81,5 +81,5 @@ image: /images/user-guide/reporting/pie-chart.png
|
||||
## الخطوات التالية
|
||||
|
||||
* [الأدوات والتصورات](/l/ar/user-guide/dashboards/capabilities/widgets)
|
||||
* [Chart settings reference](/l/ar/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [مرجع إعدادات المخطط](/l/ar/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [الأسئلة الشائعة حول لوحات المعلومات](/l/ar/user-guide/dashboards/how-tos/dashboards-faq)
|
||||
|
||||
+13
-13
@@ -116,27 +116,27 @@ image: /images/user-guide/workflows/workflow.png
|
||||
* الموضوع: متابعة لمحادثتنا
|
||||
* المحتوى: الإشارة إلى تفاصيل الاجتماع من المشغّل
|
||||
|
||||
## Email Attachments
|
||||
## مرفقات البريد الإلكتروني
|
||||
|
||||
You can attach files to emails sent from workflows. The attachment is a static file that you upload when configuring the workflow.
|
||||
يمكنك إرفاق ملفات برسائل البريد الإلكتروني المرسلة من سير العمل. المرفق ملف ثابت تقوم برفعه عند تهيئة سير العمل.
|
||||
|
||||
### How to Add an Attachment
|
||||
### كيفية إضافة مرفق
|
||||
|
||||
1. In the **Send Email** action, click on the **Attachments** button
|
||||
2. Click to upload a file from your computer
|
||||
3. The file will be attached to all emails sent by this action
|
||||
1. في إجراء **إرسال بريد إلكتروني**، انقر على زر **المرفقات**
|
||||
2. انقر لرفع ملف من جهازك
|
||||
3. سيتم إرفاق الملف بجميع رسائل البريد الإلكتروني التي يرسلها هذا الإجراء
|
||||
|
||||
### الاستخدامات الشائعة
|
||||
|
||||
| حالة الاستخدام | Example File |
|
||||
| ------------------------ | ----------------------------- |
|
||||
| **Welcome emails** | Company brochure (PDF) |
|
||||
| **Onboarding sequences** | Getting started guide |
|
||||
| **Sales follow-ups** | Product catalog or price list |
|
||||
| **Event confirmations** | Event details or agenda |
|
||||
| حالة الاستخدام | ملف نموذجي |
|
||||
| --------------------------------------- | -------------------------------- |
|
||||
| **رسائل الترحيب عبر البريد الإلكتروني** | كتيب الشركة (PDF) |
|
||||
| **تسلسلات الانضمام** | دليل البدء |
|
||||
| **متابعات المبيعات** | كتالوج المنتجات أو قائمة الأسعار |
|
||||
| **تأكيدات الفعاليات** | تفاصيل الفعالية أو جدول الأعمال |
|
||||
|
||||
<Note>
|
||||
Attachments are static—the same file is sent to all recipients. For dynamic documents (like personalized quotes), generate and attach files using a [Serverless Function](/l/ar/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
المرفقات ثابتة—يتم إرسال الملف نفسه إلى جميع المستلمين. بالنسبة للمستندات الديناميكية (مثل عروض الأسعار المخصصة)، أنشئ الملفات وأرفقها باستخدام [وظيفة بدون خادم](/l/ar/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
</Note>
|
||||
|
||||
## أفضل الممارسات
|
||||
|
||||
@@ -35,6 +35,10 @@ Vytvořte novou aplikaci pomocí oficiálního scaffolderu, poté se ověřte a
|
||||
npx create-twenty-app@latest my-twenty-app
|
||||
cd my-twenty-app
|
||||
|
||||
# If you don't use yarn@4
|
||||
corepack enable
|
||||
yarn install
|
||||
|
||||
# Authenticate using your API key (you'll be prompted)
|
||||
yarn auth:login
|
||||
|
||||
@@ -88,8 +92,6 @@ my-twenty-app/
|
||||
.nvmrc
|
||||
.yarnrc.yml
|
||||
.yarn/
|
||||
releases/
|
||||
yarn-4.9.2.cjs
|
||||
install-state.gz
|
||||
eslint.config.mjs
|
||||
tsconfig.json
|
||||
@@ -167,29 +169,43 @@ V kostce:
|
||||
|
||||
Pozdější příkazy přidají další soubory a složky:
|
||||
|
||||
* `yarn app:generate` will create a `generated/` folder (typed Twenty client + workspace types).
|
||||
* `yarn app:create-entity` will add entity definition files under `src/app/` for your custom objects, functions, or roles.
|
||||
* `yarn app:generate` vytvoří složku `generated/` (typovaný klient Twenty + typy pracovního prostoru).
|
||||
* `yarn app:create-entity` přidá soubory s definicemi entit do `src/app/` pro vaše vlastní objekty, funkce nebo role.
|
||||
l
|
||||
|
||||
## Ověření
|
||||
|
||||
The first time you run `yarn auth:login`, you'll be prompted for:
|
||||
Při prvním spuštění `yarn auth:login` budete vyzváni k zadání:
|
||||
|
||||
* URL API (výchozí je http://localhost:3000 nebo váš aktuální profil pracovního prostoru)
|
||||
* Klíč API
|
||||
|
||||
Vaše přihlašovací údaje se ukládají pro jednotlivé uživatele do `~/.twenty/config.json`. Můžete spravovat více profilů a přepínat pomocí `--workspace <name>`.
|
||||
Vaše přihlašovací údaje se ukládají pro jednotlivé uživatele do `~/.twenty/config.json`. Můžete spravovat více profilů a přepínat mezi nimi.
|
||||
|
||||
Příklady:
|
||||
### Správa pracovních prostorů
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Login interactively (recommended)
|
||||
yarn auth:login
|
||||
|
||||
# Use a specific workspace profile
|
||||
# Login to a specific workspace profile
|
||||
yarn auth:login --workspace my-custom-workspace
|
||||
|
||||
# List all configured workspaces
|
||||
yarn auth:list
|
||||
|
||||
# Switch the default workspace (interactive)
|
||||
yarn auth:switch
|
||||
|
||||
# Switch to a specific workspace
|
||||
yarn auth:switch production
|
||||
|
||||
# Check current authentication status
|
||||
yarn auth:status
|
||||
```
|
||||
|
||||
Jakmile přepnete pracovní prostor pomocí `auth:switch`, všechny následující příkazy budou tento pracovní prostor používat jako výchozí. Můžete jej stále dočasně přepsat pomocí `--workspace <name>`.
|
||||
|
||||
## Používejte zdroje SDK (typy a konfiguraci)
|
||||
|
||||
twenty-sdk poskytuje typované stavební bloky a pomocné funkce, které používáte ve své aplikaci. Níže jsou klíčové části, se kterými budete nejčastěji pracovat.
|
||||
@@ -286,7 +302,7 @@ Hlavní body:
|
||||
* Hodnota `universalIdentifier` musí být jedinečná a stabilní napříč nasazeními.
|
||||
* Každé pole vyžaduje `name`, `type`, `label` a svůj vlastní stabilní `universalIdentifier`.
|
||||
* Pole `fields` je volitelné — objekty můžete definovat i bez vlastních polí.
|
||||
* You can scaffold new objects using `yarn app:create-entity`, which guides you through naming, fields, and relationships.
|
||||
* Nové objekty můžete vygenerovat pomocí `yarn app:create-entity`, který vás provede pojmenováním, poli a vztahy.
|
||||
|
||||
<Note>
|
||||
**Základní pole jsou vytvořena automaticky.** Když definujete vlastní objekt, Twenty automaticky přidá standardní pole jako `name`, `createdAt`, `updatedAt`, `createdBy`, `position` a `deletedAt`. Nemusíte je definovat v poli `fields` — přidejte pouze svá vlastní pole.
|
||||
@@ -514,21 +530,21 @@ Běžné typy spouštěčů:
|
||||
> např. `path: '/post-card/create',` -> volání na `<APP_URL>/s/post-card/create`
|
||||
|
||||
* **cron**: Spouští vaši funkci podle plánu pomocí výrazu CRON.
|
||||
* **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.
|
||||
* **databaseEvent**: Spouští se při událostech životního cyklu objektů v pracovním prostoru. Když je operace události `updated`, lze konkrétní sledovaná pole určit v poli `updatedFields`. Pokud zůstane nedefinované nebo prázdné, spustí funkci jakákoli aktualizace.
|
||||
|
||||
> e.g. `person.updated`
|
||||
> např. `person.updated`
|
||||
|
||||
Poznámky:
|
||||
|
||||
* Pole `triggers` je volitelné. Funkce bez spouštěčů lze použít jako pomocné funkce volané jinými funkcemi.
|
||||
* V jedné funkci můžete kombinovat více typů spouštěčů.
|
||||
|
||||
### Route trigger payload
|
||||
### Payload spouštěče trasy
|
||||
|
||||
<Warning>
|
||||
**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object.
|
||||
**Zpětně nekompatibilní změna (v1.16, leden 2026):** Formát payloadu spouštěče trasy se změnil. Před verzí v1.16 byly parametry dotazu, parametry cesty a tělo odesílány přímo jako payload. Od verze v1.16 jsou zanořeny uvnitř strukturovaného objektu `RoutePayload`.
|
||||
|
||||
**Before v1.16:**
|
||||
**Před v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (params) => {
|
||||
@@ -536,7 +552,7 @@ Poznámky:
|
||||
};
|
||||
```
|
||||
|
||||
**After v1.16:**
|
||||
**Po v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -546,10 +562,10 @@ Poznámky:
|
||||
};
|
||||
```
|
||||
|
||||
**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object.
|
||||
**Jak migrovat existující funkce:** Aktualizujte svůj handler tak, aby destrukturoval z `event.body`, `event.queryStringParameters` nebo `event.pathParameters` místo přímo z objektu params.
|
||||
</Warning>
|
||||
|
||||
When a route trigger invokes your function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`:
|
||||
Když spouštěč trasy vyvolá vaši funkci, ta obdrží objekt `RoutePayload`, který odpovídá formátu AWS HTTP API v2. Importujte typ z `twenty-sdk`:
|
||||
|
||||
```typescript
|
||||
import { defineFunction, type RoutePayload } from 'twenty-sdk';
|
||||
@@ -565,21 +581,21 @@ const handler = async (event: RoutePayload) => {
|
||||
};
|
||||
```
|
||||
|
||||
The `RoutePayload` type has the following structure:
|
||||
Typ `RoutePayload` má následující strukturu:
|
||||
|
||||
| Property | Typ | Popis |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query string parameters (multiple values joined with commas) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
|
||||
| `text zprávy` | `object \| null` | Parsed request body (JSON) |
|
||||
| `isBase64Encoded` | `booleovská hodnota` | Whether the body is base64 encoded |
|
||||
| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Raw request path |
|
||||
| Vlastnost | Typ | Popis |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | Záhlaví HTTP (pouze ta uvedená v `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Parametry query stringu (více hodnot spojených čárkami) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Parametry cesty extrahované ze vzoru trasy (např. `/users/:id` → `{ id: '123' }`) |
|
||||
| `text zprávy` | `object \| null` | Parsované tělo požadavku (JSON) |
|
||||
| `isBase64Encoded` | `booleovská hodnota` | Zda je tělo kódováno base64 |
|
||||
| `requestContext.http.method` | `string` | Metoda HTTP (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Nezpracovaná cesta požadavku |
|
||||
|
||||
### Forwarding HTTP headers
|
||||
### Přeposílání záhlaví HTTP
|
||||
|
||||
By default, HTTP headers from incoming requests are **not** passed to your serverless function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array:
|
||||
Ve výchozím nastavení se záhlaví HTTP z příchozích požadavků z bezpečnostních důvodů do vaší serverless funkce **ne** předávají. Chcete-li zpřístupnit konkrétní záhlaví, výslovně je uveďte v poli `forwardedRequestHeaders`:
|
||||
|
||||
```typescript
|
||||
export default defineFunction({
|
||||
@@ -599,7 +615,7 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
In your handler, you can then access these headers:
|
||||
Ve vašem handleru k nim poté můžete přistupovat:
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -612,17 +628,17 @@ const handler = async (event: RoutePayload) => {
|
||||
```
|
||||
|
||||
<Note>
|
||||
Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`).
|
||||
Názvy záhlaví jsou normalizovány na malá písmena. Přistupujte k nim pomocí klíčů s malými písmeny (například `event.headers['content-type']`).
|
||||
</Note>
|
||||
|
||||
Nové funkce můžete vytvářet dvěma způsoby:
|
||||
|
||||
* **Scaffolded**: Run `yarn app:create-entity` and choose the option to add a new function. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací.
|
||||
* **Vygenerované**: Spusťte `yarn app:create-entity` a zvolte možnost přidat novou funkci. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací.
|
||||
* **Ruční**: Vytvořte nový soubor `*.function.ts` a použijte `defineFunction()` podle stejného vzoru.
|
||||
|
||||
### Generovaný typovaný klient
|
||||
|
||||
Run yarn app:generate to create a local typed client in generated/ based on your workspace schema. Použijte jej ve svých funkcích:
|
||||
Spusťte yarn app:generate a vytvořte lokálního typovaného klienta v generated/ na základě schématu vašeho pracovního prostoru. Použijte jej ve svých funkcích:
|
||||
|
||||
```typescript
|
||||
import Twenty from './generated';
|
||||
@@ -631,7 +647,7 @@ const client = new Twenty();
|
||||
const { me } = await client.query({ me: { id: true, displayName: true } });
|
||||
```
|
||||
|
||||
The client is re-generated by `yarn app:generate`. Re-run after changing your objects and `yarn app:sync` or when onboarding to a new workspace.
|
||||
Klient je znovu generován příkazem `yarn app:generate`. Spusťte jej znovu po změně objektů a po `yarn app:sync`, případně při připojení k novému pracovnímu prostoru.
|
||||
|
||||
#### Běhové přihlašovací údaje v serverless funkcích
|
||||
|
||||
@@ -675,13 +691,13 @@ Poté přidejte skripty jako tyto:
|
||||
}
|
||||
```
|
||||
|
||||
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:sync`, etc.
|
||||
Nyní můžete spouštět stejné příkazy přes Yarn, např. `yarn app:dev`, `yarn app:sync` atd.
|
||||
|
||||
## Řešení potíží
|
||||
|
||||
* Authentication errors: run `yarn auth:login` and ensure your API key has the required permissions.
|
||||
* Chyby ověření: spusťte `yarn auth:login` a ujistěte se, že váš klíč API má požadovaná oprávnění.
|
||||
* Nelze se připojit k serveru: ověřte URL API a že je server Twenty dosažitelný.
|
||||
* Types or client missing/outdated: run `yarn app:generate` and then `yarn app:dev`.
|
||||
* Dev mode not syncing: ensure `yarn app:dev` is running and that changes are not ignored by your environment.
|
||||
* Typy nebo klient chybí/jsou zastaralé: spusťte `yarn app:generate` a poté `yarn app:dev`.
|
||||
* Režim vývoje nesynchronizuje: ujistěte se, že běží `yarn app:dev` a že vaše prostředí změny neignoruje.
|
||||
|
||||
Kanál podpory na Discordu: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
|
||||
@@ -292,31 +292,31 @@ yarn command:prod cron:workflow:automated-cron-trigger
|
||||
**Režim pouze s prostředím:** Pokud nastavíte `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, přidejte tyto proměnné do souboru `.env`
|
||||
</Warning>
|
||||
|
||||
## Serverless Functions
|
||||
## Serverless funkce
|
||||
|
||||
Twenty supports serverless functions for workflows and custom logic. The execution environment is configured via the `SERVERLESS_TYPE` environment variable.
|
||||
Twenty podporuje serverless funkce pro pracovní postupy a vlastní logiku. Běhové prostředí se konfiguruje pomocí proměnné prostředí `SERVERLESS_TYPE`.
|
||||
|
||||
<Warning>
|
||||
**Security Notice:** The local serverless driver (`SERVERLESS_TYPE=LOCAL`) runs code directly on the host in a Node.js process with no sandboxing. It should only be used for trusted code in development. For production deployments handling untrusted code, we highly recommend using `SERVERLESS_TYPE=LAMBDA` or `SERVERLESS_TYPE=DISABLED`.
|
||||
**Upozornění na zabezpečení:** Místní serverless ovladač (`SERVERLESS_TYPE=LOCAL`) spouští kód přímo na hostiteli v procesu Node.js bez sandboxu. Měl by být používán pouze pro důvěryhodný kód při vývoji. Pro produkční nasazení, která pracují s nedůvěryhodným kódem, důrazně doporučujeme použít `SERVERLESS_TYPE=LAMBDA` nebo `SERVERLESS_TYPE=DISABLED`.
|
||||
</Warning>
|
||||
|
||||
### Available Drivers
|
||||
### Dostupné ovladače
|
||||
|
||||
| Driver | Environment Variable | Případ použití | Security Level |
|
||||
| -------- | -------------------------- | ------------------------------------- | ------------------------------- |
|
||||
| Disabled | `SERVERLESS_TYPE=DISABLED` | Disable serverless functions entirely | N/A |
|
||||
| Local | `SERVERLESS_TYPE=LOCAL` | Development and trusted environments | Low (no sandboxing) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production with untrusted code | High (hardware-level isolation) |
|
||||
| Ovladač | Proměnná prostředí | Případ použití | Úroveň zabezpečení |
|
||||
| --------- | -------------------------- | ------------------------------------------ | ----------------------------------- |
|
||||
| Neaktivní | `SERVERLESS_TYPE=DISABLED` | Úplně zakázat serverless funkce | N/A |
|
||||
| Lokální | `SERVERLESS_TYPE=LOCAL` | Vývojová a důvěryhodná prostředí | Nízká (bez sandboxu) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produkční prostředí s nedůvěryhodným kódem | Vysoká (izolace na úrovni hardwaru) |
|
||||
|
||||
### Recommended Configuration
|
||||
### Doporučená konfigurace
|
||||
|
||||
**For development:**
|
||||
**Pro vývoj:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LOCAL # default
|
||||
```
|
||||
|
||||
**For production (AWS):**
|
||||
**Pro produkci (AWS):**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LAMBDA
|
||||
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
|
||||
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
|
||||
```
|
||||
|
||||
**To disable serverless functions:**
|
||||
**Pro zakázání serverless funkcí:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=DISABLED
|
||||
```
|
||||
|
||||
<Note>
|
||||
When using `SERVERLESS_TYPE=DISABLED`, any attempt to execute a serverless function will return an error. This is useful if you want to run Twenty without serverless function capabilities.
|
||||
Při použití `SERVERLESS_TYPE=DISABLED` skončí každý pokus o spuštění serverless funkce chybou. To je užitečné, pokud chcete provozovat Twenty bez podpory serverless funkcí.
|
||||
</Note>
|
||||
|
||||
@@ -1,275 +1,275 @@
|
||||
---
|
||||
title: Chart Settings
|
||||
description: Configure your charts to display data exactly how you need it.
|
||||
title: Nastavení grafu
|
||||
description: Nakonfigurujte své grafy tak, aby zobrazovaly data přesně podle vašich potřeb.
|
||||
---
|
||||
|
||||
import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
## Accessing Chart Settings
|
||||
## Přístup k nastavení grafu
|
||||
|
||||
1. Click the **Edit** button in the top-right corner of your dashboard
|
||||
1. Klikněte na tlačítko **Upravit** v pravém horním rohu svého řídicího panelu
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Edit mode" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Režim úprav" />
|
||||
|
||||
2. The dashboard enters edit mode
|
||||
3. Click on any widget to select it
|
||||
4. The settings panel opens on the right
|
||||
2. Řídicí panel přejde do režimu úprav
|
||||
3. Klikněte na libovolný widget, abyste jej vybrali.
|
||||
4. Vpravo se otevře panel nastavení
|
||||
|
||||
Settings are organized into sections:
|
||||
Nastavení jsou uspořádána do sekcí:
|
||||
|
||||
* **Data**: What data to pull and how to filter it
|
||||
* **X axis**: How to group and sort categories (bar/line charts)
|
||||
* **Y axis**: What to measure and how to display it (bar/line charts)
|
||||
* **Style**: Colors, labels, and visual options
|
||||
* **Data**: Jaká data načíst a jak je filtrovat
|
||||
* **Osa X**: Jak seskupovat a řadit kategorie (sloupcové/čárové grafy)
|
||||
* **Osa Y**: Co měřit a jak to zobrazit (sloupcové/čárové grafy)
|
||||
* **Styl**: Barvy, popisky a vizuální možnosti
|
||||
|
||||
<Note>
|
||||
Some settings only appear when other settings are configured. For example, **Date granularity** only appears when you select a date field.
|
||||
Některá nastavení se zobrazí pouze tehdy, když jsou nakonfigurována jiná. Například **Granularita data** se zobrazí pouze tehdy, když vyberete datumové pole.
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
## Data Settings
|
||||
## Nastavení dat
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Source </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Zdroj </span>
|
||||
|
||||
Choose which object to pull data from.
|
||||
Vyberte objekt, ze kterého chcete načítat data.
|
||||
|
||||
1. Click **Source**
|
||||
2. Select an object (Opportunities, People, Companies, etc.)
|
||||
1. Klikněte na **Zdroj**
|
||||
2. Vyberte objekt (Příležitosti, Kontakty, Společnosti apod.)
|
||||
|
||||
All your standard and custom objects are available. Changing the source resets other settings since field options depend on the selected object.
|
||||
K dispozici jsou všechny vaše standardní a vlastní objekty. Změna zdroje resetuje ostatní nastavení, protože možnosti polí závisí na vybraném objektu.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-source.png" alt="Zdroj" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filter </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filtr </span>
|
||||
|
||||
Limit which records are included in the chart.
|
||||
Omezte, které záznamy jsou zahrnuty do grafu.
|
||||
|
||||
1. Klikněte na **Filtr**
|
||||
2. The filter builder opens
|
||||
3. Click **+ Add filter**
|
||||
4. Select a field, condition, and value
|
||||
5. Add more filters as needed
|
||||
2. Otevře se nástroj pro tvorbu filtrů
|
||||
3. Klikněte na **+ Přidat filtr**
|
||||
4. Vyberte pole, podmínku a hodnotu
|
||||
5. Podle potřeby přidejte další filtry
|
||||
|
||||
Filters work the same as in table views. Use them to focus on specific segments of your data.
|
||||
Filtry fungují stejně jako v tabulkových zobrazeních. Použijte je k zaměření na konkrétní segmenty dat.
|
||||
|
||||
**Example**: Filter opportunities where Stage equals "Won" to show only closed deals.
|
||||
**Příklad**: Filtrovat příležitosti, kde se pole Stage rovná "Won", abyste zobrazili pouze uzavřené obchody.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-filters.png" alt="Filtr" />
|
||||
|
||||
<Tip>
|
||||
For date fields, try **Is relative** to create dynamic filters like "Past 7 days" or "This month" that automatically update.
|
||||
U datumových polí zkuste **Je relativní** k vytvoření dynamických filtrů, jako jsou "Posledních 7 dní" nebo "Tento měsíc", které se automaticky aktualizují.
|
||||
</Tip>
|
||||
|
||||
<Tip>
|
||||
Advanced filters are supported—add multiple filter rules and combine them with **And** or **Or** logic.
|
||||
Jsou podporovány pokročilé filtry—přidejte více pravidel filtru a kombinujte je pomocí logiky **A** nebo **Nebo**.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## X Axis Settings
|
||||
## Nastavení osy X
|
||||
|
||||
These settings control the horizontal axis of bar and line charts—typically how your data is grouped into categories.
|
||||
Tato nastavení řídí vodorovnou osu sloupcových a čárových grafů—obvykle způsob, jakým jsou data seskupena do kategorií.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Zobrazená data </span>
|
||||
|
||||
Select the field to group your data by. This determines the categories shown on the X axis.
|
||||
Vyberte pole, podle kterého chcete data seskupit. To určuje kategorie zobrazené na ose X.
|
||||
|
||||
**Example**: Select "Stage" to see data grouped by pipeline stage, or "Created date" to see data over time.
|
||||
**Příklad**: Vyberte "Stage" pro zobrazení dat seskupených podle fáze v pipeline, nebo "Created date" pro zobrazení dat v čase.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-data-on-display.png" alt="Zobrazená data" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Granularita data </span>
|
||||
|
||||
When grouping by a date field, choose the time period for grouping.
|
||||
Při seskupování podle datumového pole zvolte časové období pro seskupení.
|
||||
|
||||
| Možnost | Groups data by | Example output |
|
||||
| ------------------- | -------------------- | --------------------------------------------- |
|
||||
| **Day** | Each calendar day | Jan 1, Jan 2, Jan 3... |
|
||||
| **Week** | Calendar weeks | Week 1, Week 2, Week 3... |
|
||||
| **Month** | Calendar months | January, February, March... |
|
||||
| **Quarter** | Fiscal quarters | Q1, Q2, Q3, Q4 |
|
||||
| **Year** | Calendar years | 2023, 2024, 2025 |
|
||||
| **Day of week** | Weekday (aggregated) | Monday, Tuesday... (all Mondays combined) |
|
||||
| **Month of year** | Month (aggregated) | January, February... (all Januaries combined) |
|
||||
| **Quarter of year** | Quarter (aggregated) | Q1, Q2, Q3, Q4 (all Q1s combined) |
|
||||
| Možnost | Seskupuje data podle | Ukázkový výstup |
|
||||
| ------------------ | ------------------------ | --------------------------------------------- |
|
||||
| **Den** | Každý kalendářní den | 1. ledna, 2. ledna, 3. ledna... |
|
||||
| **Týden** | Kalendářní týdny | Týden 1, Týden 2, Týden 3... |
|
||||
| **Měsíc** | Kalendářní měsíce | leden, únor, březen... |
|
||||
| **Čtvrtletí** | Fiskální čtvrtletí | Q1, Q2, Q3, Q4 |
|
||||
| **Rok** | Kalendářní roky | 2023, 2024, 2025 |
|
||||
| **Den v týdnu** | Den v týdnu (agregováno) | Pondělí, úterý... (všechna pondělí dohromady) |
|
||||
| **Měsíc v roce** | Měsíc (agregováno) | Leden, únor... (všechny ledny dohromady) |
|
||||
| **Čtvrtletí roku** | Čtvrtletí (agregováno) | Q1, Q2, Q3, Q4 (všechny Q1 dohromady) |
|
||||
|
||||
The "of week/year" options aggregate across all time. Use **Day of week** to see which weekday typically gets the most deals. Use **Month** to see trends month by month.
|
||||
Možnosti "v týdnu/roku" agregují napříč celým časovým obdobím. Použijte **Den v týdnu**, abyste zjistili, který den v týdnu obvykle přináší nejvíce obchodů. Použijte **Měsíc** k zobrazení trendů měsíc po měsíci.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Řadit podle </span>
|
||||
|
||||
Control the order of categories on the X axis.
|
||||
Ovládejte pořadí kategorií na ose X.
|
||||
|
||||
* **Position** – Uses the order defined in your Select field settings
|
||||
* **Alphabetical** – A to Z (or chronological for dates)
|
||||
* **By value** – Ordered by the metric (highest or lowest first)
|
||||
* **Manual** – Drag to set your own order
|
||||
* **Pozice** – Použije pořadí definované v nastavení pole typu Select
|
||||
* **Abecedně** – A až Z (nebo chronologicky u dat)
|
||||
* **Podle hodnoty** – Seřazeno podle metriky (nejvyšší nebo nejnižší nejdříve)
|
||||
* **Ručně** – Přetažením nastavte vlastní pořadí
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-sort.png" alt="Seřadit podle" />
|
||||
|
||||
**Tip**: For pipeline stages, use **Position** to show stages in your sales process order (Lead → Qualified → Proposal → Won).
|
||||
**Tip**: U fází pipeline použijte **Pozice** k zobrazení fází v pořadí vašeho prodejního procesu (Lead → Qualified → Proposal → Won).
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field type. Select fields have all options; date and text fields show fewer.
|
||||
Zobrazené možnosti závisí na typu pole. Pole typu Select mají všechny možnosti; datumová a textová pole jich zobrazují méně.
|
||||
</Note>
|
||||
|
||||
<Tip>
|
||||
With **Manual** sorting, drag categories to create a custom order—perfect for highlighting specific segments or telling a story with your data.
|
||||
Při řazení **Ručně** přetáhněte kategorie a vytvořte vlastní pořadí—ideální pro zvýraznění konkrétních segmentů nebo vyprávění příběhu pomocí dat.
|
||||
</Tip>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Omit zero values </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Vynechat nulové hodnoty </span>
|
||||
|
||||
Hide categories that have zero or no data.
|
||||
Skryjte kategorie, které mají nulová data nebo žádná data.
|
||||
|
||||
* **On**: Categories with no records are hidden
|
||||
* **Off**: All categories are shown, even if empty
|
||||
* **Zapnuto**: Kategorie bez záznamů jsou skryty
|
||||
* **Vypnuto**: Zobrazeny jsou všechny kategorie, i prázdné
|
||||
|
||||
Use this to clean up charts with sparse data.
|
||||
Použijte to k vyčištění grafů s řídkými daty.
|
||||
|
||||
---
|
||||
|
||||
## Y Axis Settings
|
||||
## Nastavení osy Y
|
||||
|
||||
These settings control what you're measuring and how it's displayed.
|
||||
Tato nastavení určují, co měříte a jak se to zobrazuje.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Zobrazená data </span>
|
||||
|
||||
Select the field and operation to calculate your metric.
|
||||
Vyberte pole a operaci pro výpočet své metriky.
|
||||
|
||||
* **Counts** – Count all, Count empty, Count not empty, Count unique values
|
||||
* **Math** – Sum, Average, Min, Max (number fields)
|
||||
* **Percentages** – Percent empty, Percent not empty
|
||||
* **Počty** – Počet všech, Počet prázdných, Počet neprázdných, Počet jedinečných hodnot
|
||||
* **Matematika** – Součet, Průměr, Min, Max (číselná pole)
|
||||
* **Procenta** – Procento prázdných, Procento neprázdných
|
||||
|
||||
Boolean fields add Count true/false. Aggregate charts with date fields show Earliest/Latest.
|
||||
Booleanová pole přidávají počet true/false. Agregační grafy s datumovými poli zobrazují Nejdřívější/Nejpozdější.
|
||||
|
||||
**Example**: Select "Amount" with Sum to see total deal value per category, or Count all to see number of deals.
|
||||
**Příklad**: Vyberte "Amount" se součtem (Sum) pro zobrazení celkové hodnoty obchodů podle kategorie, nebo Počet všech (Count all) pro zobrazení počtu obchodů.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-data-on-display.png" alt="Zobrazená data" />
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field and chart type. If you don't see an expected operation, check your field type.
|
||||
Zobrazené možnosti závisí na vašem poli a typu grafu. Pokud nevidíte očekávanou operaci, zkontrolujte typ pole.
|
||||
</Note>
|
||||
|
||||
### Poměr
|
||||
|
||||
For Select, Multi-select, or Boolean fields, you can calculate the percentage of a specific value.
|
||||
Pro pole typu Select, Multi-select nebo Boolean můžete spočítat procento konkrétní hodnoty.
|
||||
|
||||
1. Select a Select, Multi-select, or Boolean field
|
||||
2. Enable **Ratio**
|
||||
3. Choose the option to measure
|
||||
1. Vyberte pole typu Select, Multi-select nebo Boolean
|
||||
2. Povolte **Poměr**
|
||||
3. Zvolte možnost, kterou chcete měřit
|
||||
|
||||
**Example**: Show "Won" deals as a percentage of all opportunities. If you have 10 Won out of 50 total, the chart shows 20%.
|
||||
**Příklad**: Zobrazte obchody "Won" jako procento všech příležitostí. Pokud máte 10 "Won" z celkových 50, graf zobrazí 20 %.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Group by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Seskupit podle </span>
|
||||
|
||||
Add a second dimension to create multiple series (multiple bars or lines).
|
||||
Přidejte druhou dimenzi pro vytvoření více řad (více sloupců nebo čar).
|
||||
|
||||
1. Set your X axis field first
|
||||
2. Click **Group by**
|
||||
3. Select a second field
|
||||
1. Nejprve nastavte pole osy X
|
||||
2. Klikněte na **Seskupit podle**
|
||||
3. Vyberte druhé pole
|
||||
|
||||
**Example**: Group deals by Stage (X axis) AND by Owner (Group by) to see each person's pipeline breakdown side by side.
|
||||
**Příklad**: Seskupte obchody podle Stage (osa X) A podle Owner (Seskupit podle), abyste vedle sebe viděli rozpad pipeline podle jednotlivých osob.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-group-by.png" alt="Group by" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-group-by.png" alt="Seskupit podle" />
|
||||
|
||||
When Group by is set, you'll see multiple colors in your chart and a legend appears.
|
||||
Když je nastaveno Seskupit podle, uvidíte v grafu více barev a zobrazí se legenda.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Granularita data </span>
|
||||
|
||||
When Group by is a date field, choose the time period (same options as X axis).
|
||||
Když je Seskupit podle nastaveno na datumové pole, zvolte časové období (stejné možnosti jako u osy X).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Řadit podle </span>
|
||||
|
||||
When **Group by** is set, control the order of grouped series (e.g., which owner's bar appears first within each category).
|
||||
Když je nastaveno **Seskupit podle**, určete pořadí seskupených řad (např. který sloupec vlastníka se v rámci každé kategorie zobrazí jako první).
|
||||
|
||||
Same options as X axis sorting—Position, Alphabetical, and Manual—except **value-based sorting is not available** for secondary grouping.
|
||||
Stejné možnosti jako u řazení osy X—Pozice, Abecedně a Ručně—s výjimkou toho, že **řazení podle hodnoty není** pro sekundární seskupení k dispozici.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Cumulative </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Kumulativní </span>
|
||||
|
||||
Show running totals instead of individual values.
|
||||
Zobrazit průběžné součty místo jednotlivých hodnot.
|
||||
|
||||
* **Off**: Each bar/point shows its own value
|
||||
* **On**: Each bar/point shows the sum of all previous values plus its own
|
||||
* **Vypnuto**: Každý sloupec/bod zobrazuje svou vlastní hodnotu
|
||||
* **Zapnuto**: Každý sloupec/bod zobrazuje součet všech předchozích hodnot plus svou vlastní
|
||||
|
||||
**Example**: January = 10, February = 15
|
||||
**Příklad**: leden = 10, únor = 15
|
||||
|
||||
* Cumulative off: Shows 10 and 15
|
||||
* Cumulative on: Shows 10 and 25 (10 + 15)
|
||||
* Kumulativní vypnuto: Zobrazuje 10 a 15
|
||||
* Kumulativní zapnuto: Zobrazuje 10 a 25 (10 + 15)
|
||||
|
||||
Use cumulative to track progress toward a goal over time.
|
||||
Použijte kumulativní zobrazení ke sledování postupu k cíli v čase.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-cumulative.png" alt="Kumulativní" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min range / <ChartIcon icon="math-max" />Max range </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min. rozsah / <ChartIcon icon="math-max" />Max. rozsah </span>
|
||||
|
||||
Set fixed minimum and maximum values for the Y axis.
|
||||
Nastavte pevné minimální a maximální hodnoty osy Y.
|
||||
|
||||
* Leave blank for automatic scaling
|
||||
* Enter a number to fix the boundary
|
||||
* Ponechte prázdné pro automatické škálování
|
||||
* Zadejte číslo pro pevné nastavení hranice
|
||||
|
||||
**When to use:**
|
||||
**Kdy použít:**
|
||||
|
||||
* Set Min to 0 for accurate visual comparisons
|
||||
* Set both for consistent scales across multiple charts
|
||||
* Focus on a specific value range by setting both
|
||||
* Nastavte Min na 0 pro přesná vizuální srovnání
|
||||
* Nastavte obojí pro konzistentní měřítko napříč několika grafy
|
||||
* Zaměřte se na konkrétní rozsah hodnot nastavením obou
|
||||
|
||||
---
|
||||
|
||||
## Style Settings
|
||||
## Nastavení stylu
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Colors </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Barvy </span>
|
||||
|
||||
Set the color scheme for your chart. Choose from a variety of color palettes.
|
||||
Nastavte pro svůj graf barevné schéma. Vyberte si z řady barevných palet.
|
||||
|
||||
<Note>
|
||||
When grouping by a Select field, the chart automatically uses the colors defined for each option in your field settings.
|
||||
Při seskupení podle pole typu Select graf automaticky použije barvy definované pro každou možnost v nastavení vašeho pole.
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Axis name </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Název osy </span>
|
||||
|
||||
Choose which axis labels to show: **None**, **X axis**, **Y axis**, or **Both** (bar and line charts only).
|
||||
Zvolte, které popisky os chcete zobrazit: **Žádné**, **Osa X**, **Osa Y** nebo **Obě** (pouze pro sloupcové a čárové grafy).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Stacked bars / Stacked lines </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Skládané sloupce / Skládané čáry </span>
|
||||
|
||||
When Group by is set, choose how multiple series are displayed.
|
||||
Když je nastaveno Seskupit podle, zvolte, jak budou více řad zobrazeny.
|
||||
|
||||
* **Off (Grouped)**: Series appear side by side. Use when comparing exact values between groups.
|
||||
* **On (Stacked)**: Series stack on top of each other. Use when showing composition—how parts make up a whole.
|
||||
* **Vypnuto (Seskupené)**: Řady se zobrazí vedle sebe. Použijte při porovnávání přesných hodnot mezi skupinami.
|
||||
* **Zapnuto (Skládané)**: Řady se skládají na sebe. Použijte při zobrazení složení—jak části tvoří celek.
|
||||
|
||||
**Example**: Deals by stage, grouped by owner
|
||||
**Příklad**: Obchody podle fáze, seskupené podle vlastníka
|
||||
|
||||
* Grouped: See each owner's exact numbers side by side
|
||||
* Stacked: See total deals per stage, with each owner's contribution stacked
|
||||
* Seskupené: Uvidíte přesná čísla jednotlivých vlastníků vedle sebe
|
||||
* Skládané: Uvidíte celkový počet obchodů na fázi, s příspěvkem každého vlastníka naskládaným
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Data labels </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Popisky dat </span>
|
||||
|
||||
Show values directly on chart elements (bars, points, slices).
|
||||
Zobrazit hodnoty přímo na prvcích grafu (sloupce, body, výseče).
|
||||
|
||||
* **On**: Values appear on the chart
|
||||
* **Off**: No values shown (cleaner look)
|
||||
* **Zapnuto**: Hodnoty se zobrazí v grafu
|
||||
* **Vypnuto**: Nezobrazují se žádné hodnoty (čistší vzhled)
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legend </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legenda </span>
|
||||
|
||||
Show or hide the legend (only appears when Group by is set).
|
||||
Zobrazit nebo skrýt legendu (objeví se pouze při nastavení Seskupit podle).
|
||||
|
||||
* **On**: Legend shows what each color represents
|
||||
* **Off**: No legend displayed
|
||||
* **Zapnuto**: Legenda zobrazuje, co jednotlivé barvy představují
|
||||
* **Vypnuto**: Legenda se nezobrazuje
|
||||
|
||||
<Tip>
|
||||
**Hover** over a legend item to highlight that group. **Click** to temporarily hide it from the chart.
|
||||
**Najetím myší** na položku legendy zvýrazníte danou skupinu. **Kliknutím** ji dočasně skryjete z grafu.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## Chart-Specific Notes
|
||||
## Poznámky specifické pro grafy
|
||||
|
||||
### Koláčové grafy
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Each slice represents** – Define how slices are grouped
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Hide empty category** – Remove zero-value slices
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Show value in center** – Display the aggregate value (sum, average, count, etc.)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Každý výsek představuje** – Definujte, jak jsou výseče seskupeny
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Skrýt prázdnou kategorii** – Odebrat výseče s nulovou hodnotou
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Zobrazit hodnotu uprostřed** – Zobrazit agregační hodnotu (součet, průměr, počet atd.)
|
||||
|
||||
### Aggregate charts
|
||||
### Agregační grafy
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Add text before the number (e.g., `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Add text after the number (e.g., `%`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Přidat text před číslo (např. `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Přidat text za číslo (např. `%`)
|
||||
|
||||
@@ -12,7 +12,7 @@ description: Vytvářejte a organizujte řídicí panely pomocí karet pro vizua
|
||||
1. Přejděte v navigaci do **Dashboards**
|
||||
2. Klikněte na **+ New Record**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Create a new dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Vytvořit nový řídicí panel" />
|
||||
|
||||
3. Pojmenujte svůj řídicí panel
|
||||
4. Začněte přidávat karty a widgety
|
||||
@@ -23,27 +23,27 @@ Karty vám pomáhají uspořádat váš řídicí panel do logických sekcí.
|
||||
|
||||
### Vytváření karet
|
||||
|
||||
1. In edit mode, click **+** in the tab bar, side panel will open on the right
|
||||
1. V režimu úprav klikněte na **+** na liště karet, na pravé straně se otevře boční panel
|
||||
2. Pojmenujte svou kartu (např. "Přehled pipeline", "Výkonnost týmu")
|
||||
3. Přidejte do karty widgety
|
||||
|
||||
### Reordering Tabs
|
||||
### Změna pořadí karet
|
||||
|
||||
1. In edit mode, click and hold on the tab you want to move
|
||||
2. Drag and drop to the new position
|
||||
3. You can also click on the tab and use the command menu to move the tab to left or right
|
||||
1. V režimu úprav klikněte a podržte kartu, kterou chcete přesunout
|
||||
2. Přetáhněte a pusťte na nové místo
|
||||
3. Můžete také kliknout na kartu a použít nabídku příkazů k přesunutí karty doleva nebo doprava
|
||||
|
||||
### Deleting Tabs
|
||||
### Mazání karet
|
||||
|
||||
1. In edit mode, click on the tab you want to delete
|
||||
2. Click the **Delete** button in the command menu
|
||||
1. V režimu úprav klikněte na kartu, kterou chcete smazat
|
||||
2. Klikněte na tlačítko **Smazat** v nabídce příkazů
|
||||
|
||||
### Duplikování karet
|
||||
|
||||
1. Klikněte na kartu, kterou chcete duplikovat
|
||||
2. Klikněte na tlačítko **Duplicate** v postranním panelu
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Dashboard tab" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Karta panelu" />
|
||||
|
||||
## Rozvržení řídicího panelu
|
||||
|
||||
@@ -55,11 +55,11 @@ Karty vám pomáhají uspořádat váš řídicí panel do logických sekcí.
|
||||
|
||||
### Duplikování řídicího panelu
|
||||
|
||||
1. Select the dashboard you want to duplicate
|
||||
1. Vyberte panel, který chcete duplikovat
|
||||
2. Otevřete příkazovou lištu pomocí **Cmd + K** (nebo **Ctrl + K** ve Windows)
|
||||
3. Vyberte **Duplicate dashboard**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplicate a dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplikovat panel" />
|
||||
|
||||
### Osvědčené postupy
|
||||
|
||||
|
||||
@@ -9,12 +9,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
Twenty nabízí různé typy widgetů pro vizualizaci vašich CRM dat.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Bar Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Sloupcové grafy</span>
|
||||
|
||||
Zobrazují data jako vodorovné nebo svislé sloupce.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Bar chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Sloupcový graf" />
|
||||
</Frame>
|
||||
|
||||
**Vhodné pro:**
|
||||
@@ -30,15 +30,15 @@ Zobrazují data jako vodorovné nebo svislé sloupce.
|
||||
* Počet kontaktů přidaných za měsíc
|
||||
|
||||
<Note>
|
||||
**Display limits**: Bar charts can show a maximum of 100 bars, and 50 groups per bar when using Group By. Pokud uvidíte upozornění "Nezobrazená data: max X sloupců na graf", přidejte filtry, abyste zúžili svá data, nebo změňte seskupení (např. seskupujte podle týdnů místo dnů).
|
||||
**Limity zobrazení**: Sloupcové grafy mohou zobrazit maximálně 100 sloupců a při použití Group By 50 skupin na sloupec. Pokud uvidíte upozornění "Nezobrazená data: max X sloupců na graf", přidejte filtry, abyste zúžili svá data, nebo změňte seskupení (např. seskupujte podle týdnů místo dnů).
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Pie Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Koláčové grafy</span>
|
||||
|
||||
Zobrazují podíly z celku.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Pie chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Koláčový graf" />
|
||||
</Frame>
|
||||
|
||||
**Vhodné pro:**
|
||||
@@ -53,12 +53,12 @@ Zobrazují podíly z celku.
|
||||
* Rozdělení kontaktů podle odvětví
|
||||
* Složení pipeline podle vlastníka
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Line Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Liniové grafy</span>
|
||||
|
||||
Zobrazují trendy v čase.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Line chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Liniový graf" />
|
||||
</Frame>
|
||||
|
||||
**Vhodné pro:**
|
||||
@@ -73,12 +73,12 @@ Zobrazují trendy v čase.
|
||||
* Růst tržeb mezi čtvrtletími
|
||||
* Úroveň aktivity v čase
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Aggregate Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Agregační grafy</span>
|
||||
|
||||
Výrazně zobrazují jednotlivé klíčové hodnoty.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Aggregate chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Agregační graf" />
|
||||
</Frame>
|
||||
|
||||
**Vhodné pro:**
|
||||
@@ -118,25 +118,25 @@ Vkládejte externí nástroje a obsah přímo do svého řídicího panelu.
|
||||
* Metriky z vašeho dialeru
|
||||
* Živý obsah z vašeho nástroje pro prodejní sekvence
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Rich Text</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Formátovaný text</span>
|
||||
|
||||
Add formatted text and content directly to your dashboard.
|
||||
Přidejte formátovaný text a obsah přímo do svého řídicího panelu.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Rich text" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Formátovaný text" />
|
||||
</Frame>
|
||||
|
||||
**Vhodné pro:**
|
||||
|
||||
* Adding context or instructions
|
||||
* Dashboard descriptions
|
||||
* Notes and annotations
|
||||
* Přidání kontextu nebo pokynů
|
||||
* Popisy řídicích panelů
|
||||
* Poznámky a anotace
|
||||
|
||||
**Features:**
|
||||
**Funkce:**
|
||||
|
||||
* Rich text formatting (bold, italic, lists, etc.)
|
||||
* Image and file uploads
|
||||
* Markdown-style editing
|
||||
* Formátování textu (tučné písmo, kurzíva, seznamy apod.)
|
||||
* Nahrávání obrázků a souborů
|
||||
* Úpravy ve stylu Markdownu
|
||||
|
||||
<Note>
|
||||
**Již brzy**: Měřicí grafy (gauge) a tabulky zatím nejsou k dispozici, ale máme je v plánu.
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
---
|
||||
title: Widget FAQ
|
||||
description: Common questions and error messages explained.
|
||||
title: FAQ k widgetu
|
||||
description: Vysvětlení častých otázek a chybových hlášení.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="How do I show percentages instead of counts?">
|
||||
Three options:
|
||||
<Accordion title="Jak zobrazím procenta místo počtů?">
|
||||
Tři možnosti:
|
||||
|
||||
* **Percent empty/not empty**: Under Data on display, select Percent empty or Percent not empty
|
||||
* **Ratio**: For Select or Checkbox fields, enable Ratio to show a specific option as a percentage of all records
|
||||
* **Suffix**: For aggregate charts, add `%` as a Suffix in Style settings
|
||||
* **Procento prázdných/neprázdných**: V části Data k zobrazení vyberte Procento prázdných nebo Procento neprázdných
|
||||
* **Poměr**: U polí typu Výběr nebo Zaškrtávací políčko zapněte Poměr, aby se konkrétní možnost zobrazila jako procento ze všech záznamů
|
||||
* **Přípona**: U souhrnných grafů přidejte `%` jako příponu v nastavení stylu
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between grouped and stacked bars?">
|
||||
When using **Group by**, you can display series two ways:
|
||||
<Accordion title="Jaký je rozdíl mezi seskupenými a skládanými sloupci?">
|
||||
Při použití **Seskupit podle** můžete řady zobrazit dvěma způsoby:
|
||||
|
||||
* **Grouped**: Bars side by side—best for comparing exact values
|
||||
* **Stacked**: Bars on top of each other—best for showing composition
|
||||
* **Seskupené**: Sloupce vedle sebe—nejlepší pro porovnání přesných hodnot
|
||||
* **Skládané**: Sloupce na sobě—nejlepší pro zobrazení složení
|
||||
|
||||
Toggle **Stacked** in Style settings to switch.
|
||||
Přepněte přepínač **Skládané** v nastavení stylu.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why can't I see Sum or Average options?">
|
||||
Available operations depend on **field type**:
|
||||
<Accordion title="Proč nevidím možnosti Součet nebo Průměr?">
|
||||
Dostupné operace závisejí na **typu pole**:
|
||||
|
||||
* **Number fields**: Sum, Average, Min, Max
|
||||
* **Date fields**: Earliest, Latest (aggregate charts only)
|
||||
* **Checkbox fields**: Count true, Count false
|
||||
* **Číselná pole**: Součet, Průměr, Minimum, Maximum
|
||||
* **Datumová pole**: Nejstarší, Nejnovější (pouze souhrnné grafy)
|
||||
* **Zaškrtávací pole**: Počet true, Počet false
|
||||
|
||||
If you don't see an option, check that you've selected a compatible field type.
|
||||
Pokud nevidíte danou možnost, zkontrolujte, že jste vybrali kompatibilní typ pole.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why are some settings grayed out or missing?">
|
||||
Many settings only appear when prerequisites are met:
|
||||
<Accordion title="Proč jsou některá nastavení neaktivní nebo chybí?">
|
||||
Mnoho nastavení se zobrazí pouze po splnění podmínek:
|
||||
|
||||
* **Date granularity**: Select a date field first
|
||||
* **Group by, Legend, Stacked**: Set Source first
|
||||
* **Legend, Stacked toggles**: Set Group by first
|
||||
* **Podrobnost data**: Nejprve vyberte datumové pole
|
||||
* **Seskupit podle, Legenda, Skládané**: Nejprve nastavte Zdroj
|
||||
* **Přepínače Legenda a Skládané**: Nejprve nastavte Seskupit podle
|
||||
|
||||
If a setting is missing, configure its prerequisite first.
|
||||
Pokud nějaké nastavení chybí, nejprve nakonfigurujte jeho předpoklad.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'No data' mean?">
|
||||
The chart found no records matching your configuration.
|
||||
<Accordion title="Co znamená 'No data'?">
|
||||
Graf nenašel žádné záznamy odpovídající vašemu nastavení.
|
||||
|
||||
**To fix:** Remove or adjust filters, verify you selected the correct Source object, or check that records exist for your date range.
|
||||
**Jak to opravit:** Odeberte nebo upravte filtry, ověřte, že je v části Zdroj nastaven správný objekt, nebo zkontrolujte, že pro zvolené časové období existují záznamy.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Invalid configuration' mean?">
|
||||
A required setting is missing or incompatible.
|
||||
<Accordion title="Co znamená 'Invalid configuration'?">
|
||||
Chybí povinné nastavení nebo je nekompatibilní.
|
||||
|
||||
**To fix:** Ensure Source is set, Data on display is configured, and any required grouping fields are selected.
|
||||
**Jak to opravit:** Ujistěte se, že je nastaven Zdroj, nakonfigurována Data k zobrazení a vybrána všechna požadovaná seskupovací pole.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Undisplayed data' mean?">
|
||||
Your data exceeds display limits (100 bars, 100 data points, or 100 slices).
|
||||
<Accordion title="Co znamená 'Undisplayed data'?">
|
||||
Vaše data přesahují limity zobrazení (100 sloupců, 100 datových bodů nebo 100 výsečí).
|
||||
|
||||
**To fix:** Add filters to narrow your data, or change date granularity from Day to Week or Month.
|
||||
**Jak to opravit:** Přidejte filtry pro zúžení dat nebo změňte podrobnost data z Dne na Týden či Měsíc.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why is one axis showing no data?">
|
||||
The selected field has no values for the records in your filter, or the field type doesn't match the expected data.
|
||||
<Accordion title="Proč jedna osa nezobrazuje žádná data?">
|
||||
Vybrané pole nemá u záznamů ve vašem filtru žádné hodnoty, nebo typ pole neodpovídá očekávanému typu dat.
|
||||
|
||||
**To fix:** Try a different field, or check that records have values for the selected field.
|
||||
**Jak to opravit:** Zkuste jiné pole nebo ověřte, že záznamy mají pro vybrané pole hodnoty.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -40,9 +40,9 @@ Widgety jsou jednotlivé vizualizace, které zobrazují konkrétní data. Mezi t
|
||||
* Sloupcové grafy
|
||||
* Koláčové grafy
|
||||
* Liniové grafy
|
||||
* Aggregate charts
|
||||
* Agregační grafy
|
||||
* iFramy
|
||||
* Rich text
|
||||
* Formátovaný text
|
||||
|
||||
<Note>
|
||||
**Aktuální omezení**:
|
||||
@@ -81,5 +81,5 @@ Widgety jsou jednotlivé vizualizace, které zobrazují konkrétní data. Mezi t
|
||||
## Další kroky
|
||||
|
||||
* [Widgety a vizualizace](/l/cs/user-guide/dashboards/capabilities/widgets)
|
||||
* [Chart settings reference](/l/cs/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [Referenční příručka nastavení grafů](/l/cs/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [Nejčastější dotazy k řídicím panelům](/l/cs/user-guide/dashboards/how-tos/dashboards-faq)
|
||||
|
||||
+13
-13
@@ -116,27 +116,27 @@ Tým
|
||||
* Předmět: Navazuji na náš rozhovor
|
||||
* Text zprávy: Odkaz na podrobnosti schůzky ze spouštěče
|
||||
|
||||
## Email Attachments
|
||||
## E-mailové přílohy
|
||||
|
||||
You can attach files to emails sent from workflows. The attachment is a static file that you upload when configuring the workflow.
|
||||
K e-mailům odesílaným z pracovních postupů můžete přikládat soubory. Příloha je statický soubor, který nahrajete při konfiguraci pracovního postupu.
|
||||
|
||||
### How to Add an Attachment
|
||||
### Jak přidat přílohu
|
||||
|
||||
1. In the **Send Email** action, click on the **Attachments** button
|
||||
2. Click to upload a file from your computer
|
||||
3. The file will be attached to all emails sent by this action
|
||||
1. V akci **Odeslat e-mail** klikněte na tlačítko **Přílohy**
|
||||
2. Klikněte a nahrajte soubor ze svého počítače
|
||||
3. Soubor bude přiložen ke všem e-mailům odesílaným touto akcí
|
||||
|
||||
### Běžné scénáře použití
|
||||
|
||||
| Případ použití | Example File |
|
||||
| ------------------------ | ----------------------------- |
|
||||
| **Welcome emails** | Company brochure (PDF) |
|
||||
| **Onboarding sequences** | Getting started guide |
|
||||
| **Sales follow-ups** | Product catalog or price list |
|
||||
| **Event confirmations** | Event details or agenda |
|
||||
| Případ použití | Ukázkový soubor |
|
||||
| -------------------------- | ----------------------------------- |
|
||||
| **Uvítací e-maily** | Firemní brožura (PDF) |
|
||||
| **Úvodní sekvence** | Průvodce Začínáme |
|
||||
| **Návazné akce u prodeje** | Katalog produktů nebo ceník |
|
||||
| **Potvrzení událostí** | Podrobnosti o události nebo program |
|
||||
|
||||
<Note>
|
||||
Attachments are static—the same file is sent to all recipients. For dynamic documents (like personalized quotes), generate and attach files using a [Serverless Function](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
Přílohy jsou statické—všem příjemcům se posílá stejný soubor. U dynamických dokumentů (například personalizovaných nabídek) soubory vygenerujte a přiložte pomocí [Serverless funkce](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
</Note>
|
||||
|
||||
## Osvědčené postupy
|
||||
|
||||
@@ -35,6 +35,10 @@ Erstellen Sie mit dem offiziellen Scaffolder eine neue App, authentifizieren Sie
|
||||
npx create-twenty-app@latest my-twenty-app
|
||||
cd my-twenty-app
|
||||
|
||||
# If you don't use yarn@4
|
||||
corepack enable
|
||||
yarn install
|
||||
|
||||
# Authenticate using your API key (you'll be prompted)
|
||||
yarn auth:login
|
||||
|
||||
@@ -88,8 +92,6 @@ my-twenty-app/
|
||||
.nvmrc
|
||||
.yarnrc.yml
|
||||
.yarn/
|
||||
releases/
|
||||
yarn-4.9.2.cjs
|
||||
install-state.gz
|
||||
eslint.config.mjs
|
||||
tsconfig.json
|
||||
@@ -167,29 +169,43 @@ Auf hoher Ebene:
|
||||
|
||||
Spätere Befehle fügen weitere Dateien und Ordner hinzu:
|
||||
|
||||
* `yarn app:generate` will create a `generated/` folder (typed Twenty client + workspace types).
|
||||
* `yarn app:create-entity` will add entity definition files under `src/app/` for your custom objects, functions, or roles.
|
||||
* `yarn app:generate` erstellt einen `generated/`-Ordner (typisierter Twenty-Client + Workspace-Typen).
|
||||
* `yarn app:create-entity` fügt unter `src/app/` Entitätsdefinitionsdateien für Ihre benutzerdefinierten Objekte, Funktionen oder Rollen hinzu.
|
||||
l
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
The first time you run `yarn auth:login`, you'll be prompted for:
|
||||
Wenn Sie `yarn auth:login` zum ersten Mal ausführen, werden Sie nach Folgendem gefragt:
|
||||
|
||||
* API-URL (standardmäßig http://localhost:3000 oder Ihr aktuelles Workspace-Profil)
|
||||
* API-Schlüssel
|
||||
|
||||
Ihre Anmeldedaten werden pro Benutzer in `~/.twenty/config.json` gespeichert. Sie können mehrere Profile verwalten und mit `--workspace <name>` wechseln.
|
||||
Ihre Anmeldedaten werden pro Benutzer in `~/.twenty/config.json` gespeichert. Sie können mehrere Profile verwalten und zwischen ihnen wechseln.
|
||||
|
||||
Beispiele:
|
||||
### Arbeitsbereiche verwalten
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Login interactively (recommended)
|
||||
yarn auth:login
|
||||
|
||||
# Use a specific workspace profile
|
||||
# Login to a specific workspace profile
|
||||
yarn auth:login --workspace my-custom-workspace
|
||||
|
||||
# List all configured workspaces
|
||||
yarn auth:list
|
||||
|
||||
# Switch the default workspace (interactive)
|
||||
yarn auth:switch
|
||||
|
||||
# Switch to a specific workspace
|
||||
yarn auth:switch production
|
||||
|
||||
# Check current authentication status
|
||||
yarn auth:status
|
||||
```
|
||||
|
||||
Sobald Sie mit `auth:switch` den Arbeitsbereich gewechselt haben, verwenden alle nachfolgenden Befehle standardmäßig diesen Arbeitsbereich. Sie können es weiterhin vorübergehend mit `--workspace <name>` überschreiben.
|
||||
|
||||
## SDK-Ressourcen verwenden (Typen & Konfiguration)
|
||||
|
||||
Das twenty-sdk stellt typisierte Bausteine und Hilfsfunktionen bereit, die Sie in Ihrer App verwenden. Im Folgenden finden Sie die wichtigsten Bausteine, mit denen Sie am häufigsten arbeiten.
|
||||
@@ -286,7 +302,7 @@ Hauptpunkte:
|
||||
* Der `universalIdentifier` muss eindeutig und über Deployments hinweg stabil sein.
|
||||
* Jedes Feld benötigt `name`, `type`, `label` und einen eigenen stabilen `universalIdentifier`.
|
||||
* Das Array `fields` ist optional — Sie können Objekte ohne benutzerdefinierte Felder definieren.
|
||||
* You can scaffold new objects using `yarn app:create-entity`, which guides you through naming, fields, and relationships.
|
||||
* Sie können mit `yarn app:create-entity` neue Objekte erzeugen; der Assistent führt Sie durch Benennung, Felder und Beziehungen.
|
||||
|
||||
<Note>
|
||||
**Basisfelder werden automatisch erstellt.** Wenn Sie ein benutzerdefiniertes Objekt definieren, fügt Twenty automatisch Standardfelder wie `name`, `createdAt`, `updatedAt`, `createdBy`, `position` und `deletedAt` hinzu. Sie müssen diese nicht in Ihrem `fields`-Array definieren — fügen Sie nur Ihre benutzerdefinierten Felder hinzu.
|
||||
@@ -514,21 +530,21 @@ Häufige Trigger-Typen:
|
||||
> z. B. `path: '/post-card/create',` -> Aufruf unter `<APP_URL>/s/post-card/create`
|
||||
|
||||
* **cron**: Führt Ihre Funktion nach Zeitplan mithilfe eines CRON-Ausdrucks aus.
|
||||
* **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.
|
||||
* **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.
|
||||
|
||||
> e.g. `person.updated`
|
||||
> z. B. `person.updated`
|
||||
|
||||
Notizen:
|
||||
|
||||
* Das Array `triggers` ist optional. Funktionen ohne Trigger können als von anderen Funktionen aufgerufene Utility-Funktionen verwendet werden.
|
||||
* Sie können mehrere Trigger-Typen in einer Funktion kombinieren.
|
||||
|
||||
### Route trigger payload
|
||||
### Routen-Trigger-Payload
|
||||
|
||||
<Warning>
|
||||
**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object.
|
||||
**Breaking Change (v1.16, Januar 2026):** Das Format der Routen-Trigger-Payload hat sich geändert. Vor v1.16 wurden Query-Parameter, Pfadparameter und der Body direkt als Payload gesendet. Ab v1.16 sind sie innerhalb eines strukturierten `RoutePayload`-Objekts verschachtelt.
|
||||
|
||||
**Before v1.16:**
|
||||
**Vor v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (params) => {
|
||||
@@ -536,7 +552,7 @@ Notizen:
|
||||
};
|
||||
```
|
||||
|
||||
**After v1.16:**
|
||||
**Nach v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -546,10 +562,10 @@ Notizen:
|
||||
};
|
||||
```
|
||||
|
||||
**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object.
|
||||
**So migrieren Sie bestehende Funktionen:** Aktualisieren Sie Ihren Handler, sodass er nicht mehr direkt aus dem params-Objekt destrukturiert, sondern aus `event.body`, `event.queryStringParameters` oder `event.pathParameters`.
|
||||
</Warning>
|
||||
|
||||
When a route trigger invokes your function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`:
|
||||
Wenn ein Routen-Trigger Ihre Funktion aufruft, erhält sie ein `RoutePayload`-Objekt, das dem AWS-HTTP-API-v2-Format entspricht. Importieren Sie den Typ aus `twenty-sdk`:
|
||||
|
||||
```typescript
|
||||
import { defineFunction, type RoutePayload } from 'twenty-sdk';
|
||||
@@ -565,21 +581,21 @@ const handler = async (event: RoutePayload) => {
|
||||
};
|
||||
```
|
||||
|
||||
The `RoutePayload` type has the following structure:
|
||||
Der Typ `RoutePayload` hat die folgende Struktur:
|
||||
|
||||
| Property | Typ | Beschreibung |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query string parameters (multiple values joined with commas) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
|
||||
| `inhalt` | `object \| null` | Parsed request body (JSON) |
|
||||
| `isBase64Encoded` | `boolesch` | Whether the body is base64 encoded |
|
||||
| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Raw request path |
|
||||
| Eigenschaft | Typ | Beschreibung |
|
||||
| ---------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP-Header (nur die in `forwardedRequestHeaders` aufgelisteten) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query-String-Parameter (mehrere Werte mit Kommas verbunden) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Aus dem Routenmuster extrahierte Pfadparameter (z. B. `/users/:id` → `{ id: '123' }`) |
|
||||
| `inhalt` | `object \| null` | Geparster Request-Body (JSON) |
|
||||
| `isBase64Encoded` | `boolesch` | Gibt an, ob der Body Base64-codiert ist |
|
||||
| `requestContext.http.method` | `string` | HTTP-Methode (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Rohpfad der Anfrage |
|
||||
|
||||
### Forwarding HTTP headers
|
||||
### Weiterleiten von HTTP-Headern
|
||||
|
||||
By default, HTTP headers from incoming requests are **not** passed to your serverless function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array:
|
||||
Standardmäßig werden HTTP-Header von eingehenden Anfragen aus Sicherheitsgründen nicht an Ihre serverlose Funktion weitergegeben. Um auf bestimmte Header zuzugreifen, listen Sie diese explizit im Array `forwardedRequestHeaders` auf:
|
||||
|
||||
```typescript
|
||||
export default defineFunction({
|
||||
@@ -599,7 +615,7 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
In your handler, you can then access these headers:
|
||||
In Ihrem Handler können Sie anschließend auf diese Header zugreifen:
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -612,17 +628,17 @@ const handler = async (event: RoutePayload) => {
|
||||
```
|
||||
|
||||
<Note>
|
||||
Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`).
|
||||
Header-Namen werden in Kleinbuchstaben normalisiert. Greifen Sie mit Schlüsseln in Kleinbuchstaben darauf zu (zum Beispiel `event.headers['content-type']`).
|
||||
</Note>
|
||||
|
||||
Sie können neue Funktionen auf zwei Arten erstellen:
|
||||
|
||||
* **Scaffolded**: Run `yarn app:create-entity` and choose the option to add a new function. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt.
|
||||
* **Generiert**: Führen Sie `yarn app:create-entity` aus und wählen Sie die Option zum Hinzufügen einer neuen Funktion. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt.
|
||||
* **Manuell**: Erstellen Sie eine neue `*.function.ts`-Datei und verwenden Sie `defineFunction()` nach demselben Muster.
|
||||
|
||||
### Generierter typisierter Client
|
||||
|
||||
Run yarn app:generate to create a local typed client in generated/ based on your workspace schema. Verwenden Sie ihn in Ihren Funktionen:
|
||||
Führen Sie yarn app:generate aus, um einen lokalen typisierten Client in generated/ basierend auf Ihrem Workspace-Schema zu erstellen. Verwenden Sie ihn in Ihren Funktionen:
|
||||
|
||||
```typescript
|
||||
import Twenty from './generated';
|
||||
@@ -631,7 +647,7 @@ const client = new Twenty();
|
||||
const { me } = await client.query({ me: { id: true, displayName: true } });
|
||||
```
|
||||
|
||||
The client is re-generated by `yarn app:generate`. Re-run after changing your objects and `yarn app:sync` or when onboarding to a new workspace.
|
||||
Der Client wird durch `yarn app:generate` erneut generiert. Führen Sie ihn nach Änderungen an Ihren Objekten und nach `yarn app:sync` bzw. beim Onboarding in einen neuen Workspace erneut aus.
|
||||
|
||||
#### Laufzeit-Anmeldedaten in serverlosen Funktionen
|
||||
|
||||
@@ -675,13 +691,13 @@ Fügen Sie dann Skripte wie diese hinzu:
|
||||
}
|
||||
```
|
||||
|
||||
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:sync`, etc.
|
||||
Jetzt können Sie dieselben Befehle über Yarn ausführen, z. B. `yarn app:dev`, `yarn app:sync` usw.
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
* Authentication errors: run `yarn auth:login` and ensure your API key has the required permissions.
|
||||
* Authentifizierungsfehler: Führen Sie `yarn auth:login` aus und stellen Sie sicher, dass Ihr API-Schlüssel die erforderlichen Berechtigungen hat.
|
||||
* Verbindung zum Server nicht möglich: Überprüfen Sie die API-URL und dass der Twenty-Server erreichbar ist.
|
||||
* Types or client missing/outdated: run `yarn app:generate` and then `yarn app:dev`.
|
||||
* Dev mode not syncing: ensure `yarn app:dev` is running and that changes are not ignored by your environment.
|
||||
* Typen oder Client fehlen/veraltet: Führen Sie `yarn app:generate` und anschließend `yarn app:dev` aus.
|
||||
* Dev-Modus synchronisiert nicht: Stellen Sie sicher, dass `yarn app:dev` läuft und dass Änderungen von Ihrer Umgebung nicht ignoriert werden.
|
||||
|
||||
Discord-Hilfekanal: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
|
||||
@@ -292,31 +292,31 @@ yarn command:prod cron:workflow:automated-cron-trigger
|
||||
**Nur-Umgebungsmodus:** Wenn Sie `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` setzen, fügen Sie diese Variablen stattdessen Ihrer `.env`-Datei hinzu.
|
||||
</Warning>
|
||||
|
||||
## Serverless Functions
|
||||
## Serverlose Funktionen
|
||||
|
||||
Twenty supports serverless functions for workflows and custom logic. The execution environment is configured via the `SERVERLESS_TYPE` environment variable.
|
||||
Twenty unterstützt serverlose Funktionen für Workflows und benutzerdefinierte Logik. Die Ausführungsumgebung wird über die Umgebungsvariable `SERVERLESS_TYPE` konfiguriert.
|
||||
|
||||
<Warning>
|
||||
**Security Notice:** The local serverless driver (`SERVERLESS_TYPE=LOCAL`) runs code directly on the host in a Node.js process with no sandboxing. It should only be used for trusted code in development. For production deployments handling untrusted code, we highly recommend using `SERVERLESS_TYPE=LAMBDA` or `SERVERLESS_TYPE=DISABLED`.
|
||||
**Sicherheitshinweis:** Der lokale serverlose Treiber (`SERVERLESS_TYPE=LOCAL`) führt Code ohne Sandbox direkt auf dem Host in einem Node.js-Prozess aus. Er sollte nur für vertrauenswürdigen Code in der Entwicklung verwendet werden. Für Produktivbereitstellungen, die nicht vertrauenswürdigen Code verarbeiten, empfehlen wir nachdrücklich, `SERVERLESS_TYPE=LAMBDA` oder `SERVERLESS_TYPE=DISABLED` zu verwenden.
|
||||
</Warning>
|
||||
|
||||
### Available Drivers
|
||||
### Verfügbare Treiber
|
||||
|
||||
| Driver | Environment Variable | Anwendungsfall | Security Level |
|
||||
| -------- | -------------------------- | ------------------------------------- | ------------------------------- |
|
||||
| Disabled | `SERVERLESS_TYPE=DISABLED` | Disable serverless functions entirely | N/A |
|
||||
| Local | `SERVERLESS_TYPE=LOCAL` | Development and trusted environments | Low (no sandboxing) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production with untrusted code | High (hardware-level isolation) |
|
||||
| Treiber | Umgebungsvariable | Anwendungsfall | Sicherheitsstufe |
|
||||
| ----------- | -------------------------- | -------------------------------------------------- | ---------------------------------- |
|
||||
| Deaktiviert | `SERVERLESS_TYPE=DISABLED` | Serverlose Funktionen vollständig deaktivieren | N/A |
|
||||
| Lokal | `SERVERLESS_TYPE=LOCAL` | Entwicklung und vertrauenswürdige Umgebungen | Niedrig (keine Sandbox) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produktivbetrieb mit nicht vertrauenswürdigem Code | Hoch (Isolation auf Hardwareebene) |
|
||||
|
||||
### Recommended Configuration
|
||||
### Empfohlene Konfiguration
|
||||
|
||||
**For development:**
|
||||
**Für die Entwicklung:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LOCAL # default
|
||||
```
|
||||
|
||||
**For production (AWS):**
|
||||
**Für den Produktivbetrieb (AWS):**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LAMBDA
|
||||
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
|
||||
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
|
||||
```
|
||||
|
||||
**To disable serverless functions:**
|
||||
**Zum Deaktivieren serverloser Funktionen:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=DISABLED
|
||||
```
|
||||
|
||||
<Note>
|
||||
When using `SERVERLESS_TYPE=DISABLED`, any attempt to execute a serverless function will return an error. This is useful if you want to run Twenty without serverless function capabilities.
|
||||
Bei Verwendung von `SERVERLESS_TYPE=DISABLED` führt jeder Versuch, eine serverlose Funktion auszuführen, zu einem Fehler. Dies ist nützlich, wenn Sie Twenty ohne Unterstützung für serverlose Funktionen betreiben möchten.
|
||||
</Note>
|
||||
|
||||
@@ -1,275 +1,275 @@
|
||||
---
|
||||
title: Chart Settings
|
||||
description: Configure your charts to display data exactly how you need it.
|
||||
title: Diagramm-Einstellungen
|
||||
description: Konfigurieren Sie Ihre Diagramme so, dass Daten genau so angezeigt werden, wie Sie sie benötigen.
|
||||
---
|
||||
|
||||
import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
## Accessing Chart Settings
|
||||
## Diagramm-Einstellungen aufrufen
|
||||
|
||||
1. Click the **Edit** button in the top-right corner of your dashboard
|
||||
1. Klicken Sie auf die Schaltfläche **Bearbeiten** in der oberen rechten Ecke Ihres Dashboards
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Edit mode" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Bearbeitungsmodus" />
|
||||
|
||||
2. The dashboard enters edit mode
|
||||
3. Click on any widget to select it
|
||||
4. The settings panel opens on the right
|
||||
2. Das Dashboard wechselt in den Bearbeitungsmodus
|
||||
3. Klicken Sie auf ein beliebiges Widget, um es auszuwählen
|
||||
4. Der Einstellungsbereich öffnet sich rechts
|
||||
|
||||
Settings are organized into sections:
|
||||
Die Einstellungen sind in Abschnitte gegliedert:
|
||||
|
||||
* **Data**: What data to pull and how to filter it
|
||||
* **X axis**: How to group and sort categories (bar/line charts)
|
||||
* **Y axis**: What to measure and how to display it (bar/line charts)
|
||||
* **Style**: Colors, labels, and visual options
|
||||
* **Daten**: Welche Daten abgerufen werden und wie sie gefiltert werden
|
||||
* **X-Achse**: Wie Kategorien gruppiert und sortiert werden (Balken-/Liniendiagramme)
|
||||
* **Y-Achse**: Was gemessen wird und wie es angezeigt wird (Balken-/Liniendiagramme)
|
||||
* **Stil**: Farben, Beschriftungen und visuelle Optionen
|
||||
|
||||
<Note>
|
||||
Some settings only appear when other settings are configured. For example, **Date granularity** only appears when you select a date field.
|
||||
Einige Einstellungen erscheinen nur, wenn andere Einstellungen konfiguriert sind. Beispielsweise wird **Datumsgranularität** nur angezeigt, wenn Sie ein Datumsfeld auswählen.
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
## Data Settings
|
||||
## Daten-Einstellungen
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Source </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Quelle </span>
|
||||
|
||||
Choose which object to pull data from.
|
||||
Wählen Sie, aus welchem Objekt Daten abgerufen werden sollen.
|
||||
|
||||
1. Click **Source**
|
||||
2. Select an object (Opportunities, People, Companies, etc.)
|
||||
1. Klicken Sie auf **Quelle**
|
||||
2. Wählen Sie ein Objekt (Chancen, Personen, Unternehmen usw.)
|
||||
|
||||
All your standard and custom objects are available. Changing the source resets other settings since field options depend on the selected object.
|
||||
Alle Ihre Standard- und benutzerdefinierten Objekte sind verfügbar. Das Ändern der Quelle setzt andere Einstellungen zurück, da Feldoptionen vom ausgewählten Objekt abhängen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-source.png" alt="Quelle" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filter </span>
|
||||
|
||||
Limit which records are included in the chart.
|
||||
Begrenzen Sie, welche Datensätze in das Diagramm einbezogen werden.
|
||||
|
||||
1. Klicken Sie auf **Filter**
|
||||
2. The filter builder opens
|
||||
3. Click **+ Add filter**
|
||||
4. Select a field, condition, and value
|
||||
5. Add more filters as needed
|
||||
2. Der Filter-Editor wird geöffnet
|
||||
3. Klicken Sie auf **+ Filter hinzufügen**
|
||||
4. Wählen Sie ein Feld, eine Bedingung und einen Wert
|
||||
5. Fügen Sie bei Bedarf weitere Filter hinzu
|
||||
|
||||
Filters work the same as in table views. Use them to focus on specific segments of your data.
|
||||
Filter funktionieren genauso wie in Tabellenansichten. Verwenden Sie sie, um sich auf bestimmte Segmente Ihrer Daten zu konzentrieren.
|
||||
|
||||
**Example**: Filter opportunities where Stage equals "Won" to show only closed deals.
|
||||
**Beispiel**: Filtern Sie Chancen, bei denen Phase "Gewonnen" ist, um nur abgeschlossene Deals anzuzeigen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-filters.png" alt="Filter" />
|
||||
|
||||
<Tip>
|
||||
For date fields, try **Is relative** to create dynamic filters like "Past 7 days" or "This month" that automatically update.
|
||||
Für Datumsfelder verwenden Sie **Ist relativ**, um dynamische Filter wie "Letzte 7 Tage" oder "Dieser Monat" zu erstellen, die automatisch aktualisiert werden.
|
||||
</Tip>
|
||||
|
||||
<Tip>
|
||||
Advanced filters are supported—add multiple filter rules and combine them with **And** or **Or** logic.
|
||||
Erweiterte Filter werden unterstützt — fügen Sie mehrere Filterregeln hinzu und kombinieren Sie sie mit **Und**- oder **Oder**-Logik.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## X Axis Settings
|
||||
## Einstellungen der X-Achse
|
||||
|
||||
These settings control the horizontal axis of bar and line charts—typically how your data is grouped into categories.
|
||||
Diese Einstellungen steuern die horizontale Achse von Balken- und Liniendiagrammen — typischerweise, wie Ihre Daten in Kategorien gruppiert werden.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Angezeigte Daten </span>
|
||||
|
||||
Select the field to group your data by. This determines the categories shown on the X axis.
|
||||
Wählen Sie das Feld aus, nach dem Ihre Daten gruppiert werden sollen. Dies bestimmt die auf der X-Achse angezeigten Kategorien.
|
||||
|
||||
**Example**: Select "Stage" to see data grouped by pipeline stage, or "Created date" to see data over time.
|
||||
**Beispiel**: Wählen Sie "Phase", um Daten nach Pipeline-Phase zu gruppieren, oder "Erstellungsdatum", um Daten über die Zeit zu sehen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-data-on-display.png" alt="Angezeigte Daten" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Datumsgranularität </span>
|
||||
|
||||
When grouping by a date field, choose the time period for grouping.
|
||||
Beim Gruppieren nach einem Datumsfeld wählen Sie den Zeitraum für die Gruppierung.
|
||||
|
||||
| Option | Groups data by | Example output |
|
||||
| ------------------- | -------------------- | --------------------------------------------- |
|
||||
| **Day** | Each calendar day | Jan 1, Jan 2, Jan 3... |
|
||||
| **Week** | Calendar weeks | Week 1, Week 2, Week 3... |
|
||||
| **Month** | Calendar months | January, February, March... |
|
||||
| **Quarter** | Fiscal quarters | Q1, Q2, Q3, Q4 |
|
||||
| **Year** | Calendar years | 2023, 2024, 2025 |
|
||||
| **Day of week** | Weekday (aggregated) | Monday, Tuesday... (all Mondays combined) |
|
||||
| **Month of year** | Month (aggregated) | January, February... (all Januaries combined) |
|
||||
| **Quarter of year** | Quarter (aggregated) | Q1, Q2, Q3, Q4 (all Q1s combined) |
|
||||
| Option | Gruppiert Daten nach | Beispielausgabe |
|
||||
| ---------------------- | ---------------------- | --------------------------------------------------- |
|
||||
| **Tag** | Jeder Kalendertag | 1. Jan., 2. Jan., 3. Jan. ... |
|
||||
| **Woche** | Kalenderwochen | Woche 1, Woche 2, Woche 3 ... |
|
||||
| **Monat** | Kalendermonate | Januar, Februar, März ... |
|
||||
| **Quartal** | Geschäftsquartale | Q1, Q2, Q3, Q4 |
|
||||
| **Jahr** | Kalenderjahre | 2023, 2024, 2025 |
|
||||
| **Wochentag** | Wochentag (aggregiert) | Montag, Dienstag ... (alle Montage zusammengefasst) |
|
||||
| **Monat des Jahres** | Monat (aggregiert) | Januar, Februar ... (alle Januare zusammengefasst) |
|
||||
| **Quartal des Jahres** | Quartal (aggregiert) | Q1, Q2, Q3, Q4 (alle Q1 zusammengefasst) |
|
||||
|
||||
The "of week/year" options aggregate across all time. Use **Day of week** to see which weekday typically gets the most deals. Use **Month** to see trends month by month.
|
||||
Die "der Woche/des Jahres"-Optionen aggregieren über die gesamte Zeit. Verwenden Sie **Wochentag**, um zu sehen, welcher Wochentag typischerweise die meisten Deals bringt. Verwenden Sie **Monat**, um Trends Monat für Monat zu sehen.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sortieren nach </span>
|
||||
|
||||
Control the order of categories on the X axis.
|
||||
Steuern Sie die Reihenfolge der Kategorien auf der X-Achse.
|
||||
|
||||
* **Position** – Uses the order defined in your Select field settings
|
||||
* **Alphabetical** – A to Z (or chronological for dates)
|
||||
* **By value** – Ordered by the metric (highest or lowest first)
|
||||
* **Manual** – Drag to set your own order
|
||||
* **Position** – Verwendet die in den Einstellungen Ihres Auswahlfelds definierte Reihenfolge
|
||||
* **Alphabetisch** – A bis Z (oder chronologisch bei Daten)
|
||||
* **Nach Wert** – Nach der Kennzahl sortiert (höchste oder niedrigste zuerst)
|
||||
* **Manuell** – Ziehen Sie, um Ihre eigene Reihenfolge festzulegen
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-sort.png" alt="Sortieren nach" />
|
||||
|
||||
**Tip**: For pipeline stages, use **Position** to show stages in your sales process order (Lead → Qualified → Proposal → Won).
|
||||
**Tipp**: Für Pipeline-Phasen verwenden Sie **Position**, um Phasen in der Reihenfolge Ihres Verkaufsprozesses anzuzeigen (Lead → Qualifiziert → Angebot → Gewonnen).
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field type. Select fields have all options; date and text fields show fewer.
|
||||
Die angezeigten Optionen hängen von Ihrem Feldtyp ab. Auswahlfelder haben alle Optionen; Datums- und Textfelder zeigen weniger.
|
||||
</Note>
|
||||
|
||||
<Tip>
|
||||
With **Manual** sorting, drag categories to create a custom order—perfect for highlighting specific segments or telling a story with your data.
|
||||
Mit der Sortieroption **Manuell** können Sie Kategorien ziehen, um eine benutzerdefinierte Reihenfolge zu erstellen — ideal, um bestimmte Segmente hervorzuheben oder mit Ihren Daten eine Geschichte zu erzählen.
|
||||
</Tip>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Omit zero values </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Nullwerte auslassen </span>
|
||||
|
||||
Hide categories that have zero or no data.
|
||||
Kategorien mit Nullwerten oder ohne Daten ausblenden.
|
||||
|
||||
* **On**: Categories with no records are hidden
|
||||
* **Off**: All categories are shown, even if empty
|
||||
* **Ein**: Kategorien ohne Einträge werden ausgeblendet
|
||||
* **Aus**: Alle Kategorien werden angezeigt, auch wenn sie leer sind
|
||||
|
||||
Use this to clean up charts with sparse data.
|
||||
Verwenden Sie dies, um Diagramme mit spärlichen Daten aufzuräumen.
|
||||
|
||||
---
|
||||
|
||||
## Y Axis Settings
|
||||
## Einstellungen der Y-Achse
|
||||
|
||||
These settings control what you're measuring and how it's displayed.
|
||||
Diese Einstellungen steuern, was Sie messen und wie es angezeigt wird.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Angezeigte Daten </span>
|
||||
|
||||
Select the field and operation to calculate your metric.
|
||||
Wählen Sie das Feld und die Operation zur Berechnung Ihrer Kennzahl.
|
||||
|
||||
* **Counts** – Count all, Count empty, Count not empty, Count unique values
|
||||
* **Math** – Sum, Average, Min, Max (number fields)
|
||||
* **Percentages** – Percent empty, Percent not empty
|
||||
* **Zählungen** – Alle zählen, Leere zählen, Nicht-Leere zählen, Eindeutige Werte zählen
|
||||
* **Mathematik** – Summe, Durchschnitt, Min, Max (Zahlenfelder)
|
||||
* **Prozentsätze** – Prozent leer, Prozent nicht leer
|
||||
|
||||
Boolean fields add Count true/false. Aggregate charts with date fields show Earliest/Latest.
|
||||
Boolesche Felder fügen „Wahr/Falsch zählen“ hinzu. Aggregierte Diagramme mit Datumsfeldern zeigen Frühestes/Spätestes.
|
||||
|
||||
**Example**: Select "Amount" with Sum to see total deal value per category, or Count all to see number of deals.
|
||||
**Beispiel**: Wählen Sie „Betrag“ mit Summe, um den gesamten Deal-Wert pro Kategorie zu sehen, oder Alle zählen, um die Anzahl der Deals zu sehen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-data-on-display.png" alt="Angezeigte Daten" />
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field and chart type. If you don't see an expected operation, check your field type.
|
||||
Die angezeigten Optionen hängen von Ihrem Feld- und Diagrammtyp ab. Wenn eine erwartete Operation nicht angezeigt wird, überprüfen Sie Ihren Feldtyp.
|
||||
</Note>
|
||||
|
||||
### Verhältnis
|
||||
|
||||
For Select, Multi-select, or Boolean fields, you can calculate the percentage of a specific value.
|
||||
Für Auswahl-, Mehrfachauswahl- oder Boolesche Felder können Sie den Prozentsatz eines bestimmten Werts berechnen.
|
||||
|
||||
1. Select a Select, Multi-select, or Boolean field
|
||||
2. Enable **Ratio**
|
||||
3. Choose the option to measure
|
||||
1. Wählen Sie ein Auswahl-, Mehrfachauswahl- oder Boolesches Feld aus
|
||||
2. Aktivieren Sie **Verhältnis**
|
||||
3. Wählen Sie die zu messende Option
|
||||
|
||||
**Example**: Show "Won" deals as a percentage of all opportunities. If you have 10 Won out of 50 total, the chart shows 20%.
|
||||
**Beispiel**: Zeigen Sie "Gewonnene" Deals als Prozentsatz aller Chancen. Wenn Sie 10 „Gewonnen“-Deals von insgesamt 50 haben, zeigt das Diagramm 20 %.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Group by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Gruppieren nach </span>
|
||||
|
||||
Add a second dimension to create multiple series (multiple bars or lines).
|
||||
Fügen Sie eine zweite Dimension hinzu, um mehrere Reihen zu erstellen (mehrere Balken oder Linien).
|
||||
|
||||
1. Set your X axis field first
|
||||
2. Click **Group by**
|
||||
3. Select a second field
|
||||
1. Legen Sie zuerst Ihr X-Achsen-Feld fest
|
||||
2. Klicken Sie auf **Gruppieren nach**
|
||||
3. Wählen Sie ein zweites Feld aus
|
||||
|
||||
**Example**: Group deals by Stage (X axis) AND by Owner (Group by) to see each person's pipeline breakdown side by side.
|
||||
**Beispiel**: Gruppieren Sie Deals nach Phase (X-Achse) UND nach Inhaber (Gruppieren nach), um die Pipeline-Aufschlüsselung jeder Person nebeneinander zu sehen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-group-by.png" alt="Gruppieren nach" />
|
||||
|
||||
When Group by is set, you'll see multiple colors in your chart and a legend appears.
|
||||
Wenn Gruppieren nach eingestellt ist, sehen Sie mehrere Farben in Ihrem Diagramm und eine Legende erscheint.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Datumsgranularität </span>
|
||||
|
||||
When Group by is a date field, choose the time period (same options as X axis).
|
||||
Wenn Gruppieren nach ein Datumsfeld ist, wählen Sie den Zeitraum (gleiche Optionen wie bei der X-Achse).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sortieren nach </span>
|
||||
|
||||
When **Group by** is set, control the order of grouped series (e.g., which owner's bar appears first within each category).
|
||||
Wenn Gruppieren nach eingestellt ist, steuern Sie die Reihenfolge der gruppierten Reihen (z. B. welcher Balken des Inhabers innerhalb jeder Kategorie zuerst erscheint).
|
||||
|
||||
Same options as X axis sorting—Position, Alphabetical, and Manual—except **value-based sorting is not available** for secondary grouping.
|
||||
Gleiche Optionen wie bei der Sortierung der X-Achse — Position, Alphabetisch und Manuell — außer dass wertbasierte Sortierung für die sekundäre Gruppierung nicht verfügbar ist.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Cumulative </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Kumulativ </span>
|
||||
|
||||
Show running totals instead of individual values.
|
||||
Laufende Summen statt einzelner Werte anzeigen.
|
||||
|
||||
* **Off**: Each bar/point shows its own value
|
||||
* **On**: Each bar/point shows the sum of all previous values plus its own
|
||||
* **Aus**: Jeder Balken/Punkt zeigt seinen eigenen Wert
|
||||
* **Ein**: Jeder Balken/Punkt zeigt die Summe aller vorherigen Werte plus seinen eigenen
|
||||
|
||||
**Example**: January = 10, February = 15
|
||||
**Beispiel**: Januar = 10, Februar = 15
|
||||
|
||||
* Cumulative off: Shows 10 and 15
|
||||
* Cumulative on: Shows 10 and 25 (10 + 15)
|
||||
* Kumulativ aus: Zeigt 10 und 15
|
||||
* Kumulativ ein: Zeigt 10 und 25 (10 + 15)
|
||||
|
||||
Use cumulative to track progress toward a goal over time.
|
||||
Verwenden Sie „Kumulativ“, um den Fortschritt zu einem Ziel im Zeitverlauf zu verfolgen.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-cumulative.png" alt="Kumulativ" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min range / <ChartIcon icon="math-max" />Max range </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min-Bereich / <ChartIcon icon="math-max" />Max-Bereich </span>
|
||||
|
||||
Set fixed minimum and maximum values for the Y axis.
|
||||
Legen Sie feste Mindest- und Höchstwerte für die Y-Achse fest.
|
||||
|
||||
* Leave blank for automatic scaling
|
||||
* Enter a number to fix the boundary
|
||||
* Leer lassen für automatische Skalierung
|
||||
* Geben Sie eine Zahl ein, um die Grenze festzulegen
|
||||
|
||||
**When to use:**
|
||||
**Wann verwenden:**
|
||||
|
||||
* Set Min to 0 for accurate visual comparisons
|
||||
* Set both for consistent scales across multiple charts
|
||||
* Focus on a specific value range by setting both
|
||||
* Setzen Sie Min auf 0 für genaue visuelle Vergleiche
|
||||
* Setzen Sie beides für konsistente Skalen über mehrere Diagramme hinweg
|
||||
* Fokussieren Sie einen bestimmten Wertebereich, indem Sie beide festlegen
|
||||
|
||||
---
|
||||
|
||||
## Style Settings
|
||||
## Stil-Einstellungen
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Colors </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Farben </span>
|
||||
|
||||
Set the color scheme for your chart. Choose from a variety of color palettes.
|
||||
Legen Sie das Farbschema für Ihr Diagramm fest. Wählen Sie aus einer Vielzahl von Farbpaletten.
|
||||
|
||||
<Note>
|
||||
When grouping by a Select field, the chart automatically uses the colors defined for each option in your field settings.
|
||||
Beim Gruppieren nach einem Auswahlfeld verwendet das Diagramm automatisch die in Ihren Feldeinstellungen für jede Option definierten Farben.
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Axis name </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Achsenname </span>
|
||||
|
||||
Choose which axis labels to show: **None**, **X axis**, **Y axis**, or **Both** (bar and line charts only).
|
||||
Wählen Sie, welche Achsenbeschriftungen angezeigt werden sollen: **Keine**, **X-Achse**, **Y-Achse** oder **Beide** (nur Balken- und Liniendiagramme).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Stacked bars / Stacked lines </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Gestapelte Balken / Gestapelte Linien </span>
|
||||
|
||||
When Group by is set, choose how multiple series are displayed.
|
||||
Wenn Gruppieren nach eingestellt ist, wählen Sie, wie mehrere Reihen angezeigt werden.
|
||||
|
||||
* **Off (Grouped)**: Series appear side by side. Use when comparing exact values between groups.
|
||||
* **On (Stacked)**: Series stack on top of each other. Use when showing composition—how parts make up a whole.
|
||||
* **Aus (Gruppiert)**: Reihen erscheinen nebeneinander. Verwenden Sie dies, wenn exakte Werte zwischen Gruppen verglichen werden.
|
||||
* **Ein (Gestapelt)**: Reihen werden übereinander gestapelt. Verwenden Sie dies, wenn Sie die Zusammensetzung zeigen — wie Teile ein Ganzes bilden.
|
||||
|
||||
**Example**: Deals by stage, grouped by owner
|
||||
**Beispiel**: Deals nach Phase, gruppiert nach Inhaber
|
||||
|
||||
* Grouped: See each owner's exact numbers side by side
|
||||
* Stacked: See total deals per stage, with each owner's contribution stacked
|
||||
* Gruppiert: Sehen Sie die exakten Zahlen jedes Inhabers nebeneinander
|
||||
* Gestapelt: Sehen Sie die Gesamtzahl der Deals pro Phase, mit dem gestapelten Beitrag jedes Inhabers
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Data labels </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Datenbeschriftungen </span>
|
||||
|
||||
Show values directly on chart elements (bars, points, slices).
|
||||
Werte direkt auf Diagrammelementen (Balken, Punkte, Segmente) anzeigen.
|
||||
|
||||
* **On**: Values appear on the chart
|
||||
* **Off**: No values shown (cleaner look)
|
||||
* **Ein**: Werte erscheinen im Diagramm
|
||||
* **Aus**: Keine Werte angezeigt (aufgeräumtere Darstellung)
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legend </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legende </span>
|
||||
|
||||
Show or hide the legend (only appears when Group by is set).
|
||||
Legende anzeigen oder ausblenden (erscheint nur, wenn Gruppieren nach eingestellt ist).
|
||||
|
||||
* **On**: Legend shows what each color represents
|
||||
* **Off**: No legend displayed
|
||||
* **Ein**: Die Legende zeigt, was jede Farbe darstellt
|
||||
* **Aus**: Keine Legende angezeigt
|
||||
|
||||
<Tip>
|
||||
**Hover** over a legend item to highlight that group. **Click** to temporarily hide it from the chart.
|
||||
**Bewegen Sie den Mauszeiger** über ein Legendenelement, um diese Gruppe hervorzuheben. **Klicken** Sie, um es vorübergehend aus dem Diagramm auszublenden.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## Chart-Specific Notes
|
||||
## Diagrammspezifische Hinweise
|
||||
|
||||
### Tortendiagramme
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Each slice represents** – Define how slices are grouped
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Hide empty category** – Remove zero-value slices
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Show value in center** – Display the aggregate value (sum, average, count, etc.)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Jedes Segment steht für** – Legen Sie fest, wie Segmente gruppiert werden
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Leere Kategorie ausblenden** – Nullwert-Segmente entfernen
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Wert in der Mitte anzeigen** – Den aggregierten Wert anzeigen (Summe, Durchschnitt, Anzahl usw.)
|
||||
|
||||
### Aggregate charts
|
||||
### Aggregierte Diagramme
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Add text before the number (e.g., `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Add text after the number (e.g., `%`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Präfix** – Text vor der Zahl hinzufügen (z. B. `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Text nach der Zahl hinzufügen (z. B. `%`)
|
||||
|
||||
@@ -12,7 +12,7 @@ Dashboards in Twenty sind hierarchisch organisiert: **Dashboards → Registerkar
|
||||
1. Gehen Sie in der Navigation zu **Dashboards**
|
||||
2. Klicken Sie auf **+ Neuer Datensatz**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Create a new dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Neues Dashboard erstellen" />
|
||||
|
||||
3. Geben Sie Ihrem Dashboard einen Namen
|
||||
4. Fügen Sie Registerkarten und Widgets hinzu
|
||||
@@ -23,27 +23,27 @@ Registerkarten helfen Ihnen, Ihr Dashboard in logische Abschnitte zu gliedern.
|
||||
|
||||
### Registerkarten erstellen
|
||||
|
||||
1. In edit mode, click **+** in the tab bar, side panel will open on the right
|
||||
1. Im Bearbeitungsmodus klicken Sie in der Registerkartenleiste auf **+**; der Seitenbereich öffnet sich rechts
|
||||
2. Benennen Sie Ihre Registerkarte (z. B. "Pipeline-Übersicht", "Teamleistung")
|
||||
3. Fügen Sie der Registerkarte Widgets hinzu
|
||||
|
||||
### Reordering Tabs
|
||||
### Registerkarten neu anordnen
|
||||
|
||||
1. In edit mode, click and hold on the tab you want to move
|
||||
2. Drag and drop to the new position
|
||||
3. You can also click on the tab and use the command menu to move the tab to left or right
|
||||
1. Im Bearbeitungsmodus klicken Sie auf die Registerkarte, die Sie verschieben möchten, und halten Sie die Maustaste gedrückt
|
||||
2. Per Drag-and-Drop an die neue Position verschieben
|
||||
3. Sie können auch auf die Registerkarte klicken und das Befehlsmenü verwenden, um die Registerkarte nach links oder rechts zu verschieben
|
||||
|
||||
### Deleting Tabs
|
||||
### Registerkarten löschen
|
||||
|
||||
1. In edit mode, click on the tab you want to delete
|
||||
2. Click the **Delete** button in the command menu
|
||||
1. Im Bearbeitungsmodus klicken Sie auf die Registerkarte, die Sie löschen möchten
|
||||
2. Klicken Sie im Befehlsmenü auf die Schaltfläche **Löschen**
|
||||
|
||||
### Registerkarten duplizieren
|
||||
|
||||
1. Klicken Sie auf die Registerkarte, die Sie duplizieren möchten
|
||||
2. Klicken Sie in der Seitenleiste auf die Schaltfläche **Duplizieren**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Dashboard tab" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Dashboard-Registerkarte" />
|
||||
|
||||
## Dashboard-Layout
|
||||
|
||||
@@ -55,11 +55,11 @@ Registerkarten helfen Ihnen, Ihr Dashboard in logische Abschnitte zu gliedern.
|
||||
|
||||
### Ein Dashboard duplizieren
|
||||
|
||||
1. Select the dashboard you want to duplicate
|
||||
1. Wählen Sie das Dashboard aus, das Sie duplizieren möchten
|
||||
2. Öffnen Sie die Befehlsleiste mit **Cmd + K** (oder **Ctrl + K** unter Windows)
|
||||
3. Wählen Sie **Dashboard duplizieren**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplicate a dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Dashboard duplizieren" />
|
||||
|
||||
### Beste Praktiken
|
||||
|
||||
|
||||
@@ -9,12 +9,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
Twenty bietet verschiedene Widget-Typen, um Ihre CRM-Daten zu visualisieren.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Bar Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Balkendiagramme</span>
|
||||
|
||||
Stellen Sie Daten als horizontale oder vertikale Balken dar.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Bar chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Balkendiagramm" />
|
||||
</Frame>
|
||||
|
||||
**Am besten geeignet für:**
|
||||
@@ -30,15 +30,15 @@ Stellen Sie Daten als horizontale oder vertikale Balken dar.
|
||||
* Hinzugefügte Kontakte pro Monat
|
||||
|
||||
<Note>
|
||||
**Display limits**: Bar charts can show a maximum of 100 bars, and 50 groups per bar when using Group By. Wenn Sie die Warnung "Nicht angezeigte Daten: max. X Balken pro Diagramm" sehen, fügen Sie Filter hinzu, um Ihre Daten einzugrenzen, oder ändern Sie die Gruppierung (z. B. nach Woche statt nach Tagen).
|
||||
**Anzeigegrenzen**: Balkendiagramme können maximal 100 Balken anzeigen sowie bei Verwendung von Group By 50 Gruppen pro Balken. Wenn Sie die Warnung "Nicht angezeigte Daten: max. X Balken pro Diagramm" sehen, fügen Sie Filter hinzu, um Ihre Daten einzugrenzen, oder ändern Sie die Gruppierung (z. B. nach Woche statt nach Tagen).
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Pie Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Tortendiagramme</span>
|
||||
|
||||
Zeigen Sie Anteile eines Ganzen.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Pie chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Tortendiagramm" />
|
||||
</Frame>
|
||||
|
||||
**Am besten geeignet für:**
|
||||
@@ -53,12 +53,12 @@ Zeigen Sie Anteile eines Ganzen.
|
||||
* Kontaktaufschlüsselung nach Branche
|
||||
* Pipeline-Zusammensetzung nach Eigentümer
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Line Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Liniendiagramme</span>
|
||||
|
||||
Stellen Sie Trends im Zeitverlauf dar.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Line chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Liniendiagramm" />
|
||||
</Frame>
|
||||
|
||||
**Am besten geeignet für:**
|
||||
@@ -73,12 +73,12 @@ Stellen Sie Trends im Zeitverlauf dar.
|
||||
* Umsatzwachstum über Quartale
|
||||
* Aktivitätsniveau im Zeitverlauf
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Aggregate Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Aggregierte Diagramme</span>
|
||||
|
||||
Zeigen Sie einzelne Kennzahlen prominent an.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Aggregate chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Aggregiertes Diagramm" />
|
||||
</Frame>
|
||||
|
||||
**Am besten geeignet für:**
|
||||
@@ -118,25 +118,25 @@ Betten Sie externe Tools und Inhalte direkt in Ihr Dashboard ein.
|
||||
* Kennzahlen aus Ihrem Dialer
|
||||
* Live-Inhalte aus Ihrem Tool für Sales-Sequenzen
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Rich Text</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Rich-Text</span>
|
||||
|
||||
Add formatted text and content directly to your dashboard.
|
||||
Fügen Sie formatierten Text und Inhalte direkt zu Ihrem Dashboard hinzu.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Rich text" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Rich-Text" />
|
||||
</Frame>
|
||||
|
||||
**Am besten geeignet für:**
|
||||
|
||||
* Adding context or instructions
|
||||
* Dashboard descriptions
|
||||
* Notes and annotations
|
||||
* Kontext oder Anweisungen hinzufügen
|
||||
* Dashboard-Beschreibungen
|
||||
* Notizen und Anmerkungen
|
||||
|
||||
**Features:**
|
||||
**Funktionen:**
|
||||
|
||||
* Rich text formatting (bold, italic, lists, etc.)
|
||||
* Image and file uploads
|
||||
* Markdown-style editing
|
||||
* Rich-Text-Formatierung (fett, kursiv, Listen usw.)
|
||||
* Bild- und Dateiuploads
|
||||
* Bearbeitung im Markdown-Stil
|
||||
|
||||
<Note>
|
||||
**Bald verfügbar**: Tachometerdiagramme und Tabellen sind noch nicht verfügbar, stehen aber auf unserer Roadmap.
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
---
|
||||
title: Widget FAQ
|
||||
description: Common questions and error messages explained.
|
||||
title: Widget-FAQ
|
||||
description: Häufige Fragen und Fehlermeldungen erklärt.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="How do I show percentages instead of counts?">
|
||||
Three options:
|
||||
<Accordion title="Wie zeige ich Prozentsätze statt Anzahlen?">
|
||||
Drei Optionen:
|
||||
|
||||
* **Percent empty/not empty**: Under Data on display, select Percent empty or Percent not empty
|
||||
* **Ratio**: For Select or Checkbox fields, enable Ratio to show a specific option as a percentage of all records
|
||||
* **Suffix**: For aggregate charts, add `%` as a Suffix in Style settings
|
||||
* **Prozent leer/nicht leer**: Unter Angezeigte Daten wählen Sie Prozent leer oder Prozent nicht leer aus
|
||||
* **Verhältnis**: Für Auswahl- oder Kontrollkästchenfelder aktivieren Sie Verhältnis, um eine bestimmte Option als Prozentsatz aller Datensätze anzuzeigen
|
||||
* **Suffix**: Für aggregierte Diagramme fügen Sie in den Stileinstellungen `%` als Suffix hinzu
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between grouped and stacked bars?">
|
||||
When using **Group by**, you can display series two ways:
|
||||
<Accordion title="Was ist der Unterschied zwischen gruppierten und gestapelten Balken?">
|
||||
Bei Verwendung von **Gruppieren nach** können Sie Reihen auf zwei Arten anzeigen:
|
||||
|
||||
* **Grouped**: Bars side by side—best for comparing exact values
|
||||
* **Stacked**: Bars on top of each other—best for showing composition
|
||||
* **Gruppiert**: Balken nebeneinander—am besten zum Vergleichen exakter Werte
|
||||
* **Gestapelt**: Balken übereinander—am besten, um die Zusammensetzung zu zeigen
|
||||
|
||||
Toggle **Stacked** in Style settings to switch.
|
||||
Schalten Sie **Gestapelt** in den Stileinstellungen um, um zu wechseln.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why can't I see Sum or Average options?">
|
||||
Available operations depend on **field type**:
|
||||
<Accordion title="Warum sehe ich die Optionen Summe oder Durchschnitt nicht?">
|
||||
Verfügbare Operationen hängen vom **Feldtyp** ab:
|
||||
|
||||
* **Number fields**: Sum, Average, Min, Max
|
||||
* **Date fields**: Earliest, Latest (aggregate charts only)
|
||||
* **Checkbox fields**: Count true, Count false
|
||||
* **Zahlenfelder**: Summe, Durchschnitt, Minimum, Maximum
|
||||
* **Datumsfelder**: Frühestes, Spätestes (nur bei aggregierten Diagrammen)
|
||||
* **Kontrollkästchenfelder**: Anzahl wahr, Anzahl falsch
|
||||
|
||||
If you don't see an option, check that you've selected a compatible field type.
|
||||
Wenn Sie eine Option nicht sehen, prüfen Sie, ob Sie einen kompatiblen Feldtyp ausgewählt haben.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why are some settings grayed out or missing?">
|
||||
Many settings only appear when prerequisites are met:
|
||||
<Accordion title="Warum sind einige Einstellungen ausgegraut oder fehlen?">
|
||||
Viele Einstellungen werden erst angezeigt, wenn Voraussetzungen erfüllt sind:
|
||||
|
||||
* **Date granularity**: Select a date field first
|
||||
* **Group by, Legend, Stacked**: Set Source first
|
||||
* **Legend, Stacked toggles**: Set Group by first
|
||||
* **Datumsgranularität**: Wählen Sie zuerst ein Datumsfeld aus
|
||||
* **Gruppieren nach, Legende, Gestapelt**: Legen Sie zuerst die Quelle fest
|
||||
* **Schalter für Legende und Gestapelt**: Legen Sie zuerst Gruppieren nach fest
|
||||
|
||||
If a setting is missing, configure its prerequisite first.
|
||||
Wenn eine Einstellung fehlt, konfigurieren Sie zuerst die zugehörige Voraussetzung.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'No data' mean?">
|
||||
The chart found no records matching your configuration.
|
||||
<Accordion title="Was bedeutet 'Keine Daten'?">
|
||||
Das Diagramm hat keine Datensätze gefunden, die Ihrer Konfiguration entsprechen.
|
||||
|
||||
**To fix:** Remove or adjust filters, verify you selected the correct Source object, or check that records exist for your date range.
|
||||
**So beheben Sie das Problem:** Entfernen oder passen Sie Filter an, vergewissern Sie sich, dass Sie das richtige Quellobjekt ausgewählt haben, oder prüfen Sie, ob für Ihren Datumsbereich Datensätze vorhanden sind.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Invalid configuration' mean?">
|
||||
A required setting is missing or incompatible.
|
||||
<Accordion title="Was bedeutet 'Ungültige Konfiguration'?">
|
||||
Eine erforderliche Einstellung fehlt oder ist nicht kompatibel.
|
||||
|
||||
**To fix:** Ensure Source is set, Data on display is configured, and any required grouping fields are selected.
|
||||
**So beheben Sie das Problem:** Stellen Sie sicher, dass die Quelle festgelegt ist, Angezeigte Daten konfiguriert sind und alle erforderlichen Gruppierungsfelder ausgewählt sind.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Undisplayed data' mean?">
|
||||
Your data exceeds display limits (100 bars, 100 data points, or 100 slices).
|
||||
<Accordion title="Was bedeutet 'Nicht angezeigte Daten'?">
|
||||
Ihre Daten überschreiten die Anzeigebegrenzungen (100 Balken, 100 Datenpunkte oder 100 Segmente).
|
||||
|
||||
**To fix:** Add filters to narrow your data, or change date granularity from Day to Week or Month.
|
||||
**So beheben Sie das Problem:** Fügen Sie Filter hinzu, um Ihre Daten einzugrenzen, oder ändern Sie die Datumsgranularität von Tag auf Woche oder Monat.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why is one axis showing no data?">
|
||||
The selected field has no values for the records in your filter, or the field type doesn't match the expected data.
|
||||
<Accordion title="Warum zeigt eine Achse keine Daten an?">
|
||||
Das ausgewählte Feld hat für die Datensätze in Ihrem Filter keine Werte, oder der Feldtyp entspricht nicht den erwarteten Daten.
|
||||
|
||||
**To fix:** Try a different field, or check that records have values for the selected field.
|
||||
**So beheben Sie das Problem:** Probieren Sie ein anderes Feld aus, oder prüfen Sie, ob Datensätze Werte für das ausgewählte Feld haben.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -40,9 +40,9 @@ Widgets sind einzelne Visualisierungen, die spezifische Daten anzeigen. Zu den T
|
||||
* Balkendiagramme
|
||||
* Tortendiagramme
|
||||
* Liniendiagramme
|
||||
* Aggregate charts
|
||||
* Aggregierte Diagramme
|
||||
* iFrames
|
||||
* Rich text
|
||||
* Rich-Text
|
||||
|
||||
<Note>
|
||||
**Aktuelle Einschränkungen**:
|
||||
@@ -81,5 +81,5 @@ Widgets sind einzelne Visualisierungen, die spezifische Daten anzeigen. Zu den T
|
||||
## Nächste Schritte
|
||||
|
||||
* [Widgets und Visualisierungen](/l/de/user-guide/dashboards/capabilities/widgets)
|
||||
* [Chart settings reference](/l/de/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [Referenz zu den Diagrammeinstellungen](/l/de/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [FAQ zu Dashboards](/l/de/user-guide/dashboards/how-tos/dashboards-faq)
|
||||
|
||||
+13
-13
@@ -116,27 +116,27 @@ Das Team
|
||||
* Betreff: Rückmeldung zu unserem Gespräch
|
||||
* Text: Verweisen Sie auf Besprechungsdetails aus dem Auslöser
|
||||
|
||||
## Email Attachments
|
||||
## E-Mail-Anhänge
|
||||
|
||||
You can attach files to emails sent from workflows. The attachment is a static file that you upload when configuring the workflow.
|
||||
Sie können Dateien an E-Mails anhängen, die von Workflows gesendet werden. Der Anhang ist eine statische Datei, die Sie beim Konfigurieren des Workflows hochladen.
|
||||
|
||||
### How to Add an Attachment
|
||||
### So fügen Sie einen Anhang hinzu
|
||||
|
||||
1. In the **Send Email** action, click on the **Attachments** button
|
||||
2. Click to upload a file from your computer
|
||||
3. The file will be attached to all emails sent by this action
|
||||
1. Klicken Sie in der Aktion **E-Mail senden** auf die Schaltfläche **Anhänge**
|
||||
2. Klicken Sie, um eine Datei von Ihrem Computer hochzuladen
|
||||
3. Die Datei wird allen E-Mails, die durch diese Aktion gesendet werden, angehängt
|
||||
|
||||
### Häufige Anwendungsfälle
|
||||
|
||||
| Anwendungsfall | Example File |
|
||||
| ------------------------ | ----------------------------- |
|
||||
| **Welcome emails** | Company brochure (PDF) |
|
||||
| **Onboarding sequences** | Getting started guide |
|
||||
| **Sales follow-ups** | Product catalog or price list |
|
||||
| **Event confirmations** | Event details or agenda |
|
||||
| Anwendungsfall | Beispieldatei |
|
||||
| ------------------------------- | --------------------------------- |
|
||||
| **Willkommens-E-Mails** | Unternehmensbroschüre (PDF) |
|
||||
| **Onboarding-Sequenzen** | Leitfaden für die ersten Schritte |
|
||||
| **Vertriebs-Nachverfolgungen** | Produktkatalog oder Preisliste |
|
||||
| **Veranstaltungsbestätigungen** | Veranstaltungsdetails oder Agenda |
|
||||
|
||||
<Note>
|
||||
Attachments are static—the same file is sent to all recipients. For dynamic documents (like personalized quotes), generate and attach files using a [Serverless Function](/l/de/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
Anhänge sind statisch—dieselbe Datei wird an alle Empfänger gesendet. Für dynamische Dokumente (z. B. personalisierte Angebote) erstellen und hängen Sie Dateien mithilfe einer [Serverless-Funktion](/l/de/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) an.
|
||||
</Note>
|
||||
|
||||
## Beste Praktiken
|
||||
|
||||
@@ -35,33 +35,40 @@ Creați o aplicație nouă folosind generatorul oficial, apoi autentificați-vă
|
||||
npx create-twenty-app@latest my-twenty-app
|
||||
cd my-twenty-app
|
||||
|
||||
# If you don't use yarn@4
|
||||
corepack enable
|
||||
yarn install
|
||||
|
||||
# Authenticate using your API key (you'll be prompted)
|
||||
yarn auth
|
||||
yarn auth:login
|
||||
|
||||
# Start dev mode: automatically syncs local changes to your workspace
|
||||
yarn dev
|
||||
yarn app:dev
|
||||
```
|
||||
|
||||
De aici puteți:
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Add a new entity to your application (guided)
|
||||
yarn create-entity
|
||||
yarn app:create-entity
|
||||
|
||||
# Generate a typed Twenty client and workspace entity types
|
||||
yarn generate
|
||||
yarn app:generate
|
||||
|
||||
# Run a one‑time sync (instead of watch mode)
|
||||
yarn sync
|
||||
yarn app:sync
|
||||
|
||||
# Watch your application's functions logs
|
||||
yarn logs
|
||||
yarn function:logs
|
||||
|
||||
# Execute a function by name
|
||||
yarn function:execute -n my-function -p '{"name": "test"}'
|
||||
|
||||
# Uninstall the application from the current workspace
|
||||
yarn uninstall
|
||||
yarn app:uninstall
|
||||
|
||||
# Display commands' help
|
||||
yarn help
|
||||
yarn app:help},{
|
||||
```
|
||||
|
||||
Consultați și: paginile de referință CLI pentru [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) și [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
|
||||
@@ -85,8 +92,6 @@ my-twenty-app/
|
||||
.nvmrc
|
||||
.yarnrc.yml
|
||||
.yarn/
|
||||
releases/
|
||||
yarn-4.9.2.cjs
|
||||
install-state.gz
|
||||
eslint.config.mjs
|
||||
tsconfig.json
|
||||
@@ -164,28 +169,43 @@ Pe scurt:
|
||||
|
||||
Comenzile ulterioare vor adăuga mai multe fișiere și foldere:
|
||||
|
||||
* `yarn generate` va crea un folder `generated/` (client Twenty tipizat + tipuri pentru spațiul de lucru).
|
||||
* `yarn create-entity` va adăuga fișiere de definire a entităților în `src/app/` pentru obiectele, funcțiile sau rolurile personalizate.
|
||||
* `yarn app:generate` va crea un folder `generated/` (client Twenty tipizat + tipuri pentru spațiul de lucru).
|
||||
* `yarn app:create-entity` va adăuga fișiere de definire a entităților în `src/app/` pentru obiectele, funcțiile sau rolurile personalizate.
|
||||
l
|
||||
|
||||
## Autentificare
|
||||
|
||||
Prima dată când rulați `yarn auth`, vi se vor solicita:
|
||||
Prima dată când rulați `yarn auth:login`, vi se vor solicita:
|
||||
|
||||
* URL-ul API (implicit http://localhost:3000 sau profilul spațiului de lucru curent)
|
||||
* Cheie API
|
||||
|
||||
Acreditările dvs. sunt stocate per utilizator în `~/.twenty/config.json`. Puteți menține mai multe profiluri și comuta folosind `--workspace <name>`.
|
||||
Acreditările dvs. sunt stocate per utilizator în `~/.twenty/config.json`. Puteți menține mai multe profiluri și comuta între ele.
|
||||
|
||||
Exemple:
|
||||
### Gestionarea spațiilor de lucru
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Login interactively (recommended)
|
||||
yarn auth
|
||||
yarn auth:login
|
||||
|
||||
# Use a specific workspace profile
|
||||
yarn auth --workspace my-custom-workspace
|
||||
# Login to a specific workspace profile
|
||||
yarn auth:login --workspace my-custom-workspace
|
||||
|
||||
# List all configured workspaces
|
||||
yarn auth:list
|
||||
|
||||
# Switch the default workspace (interactive)
|
||||
yarn auth:switch
|
||||
|
||||
# Switch to a specific workspace
|
||||
yarn auth:switch production
|
||||
|
||||
# Check current authentication status
|
||||
yarn auth:status
|
||||
```
|
||||
|
||||
După ce ați schimbat spațiul de lucru cu `auth:switch`, toate comenzile ulterioare vor folosi implicit acel spațiu de lucru. Îl puteți totuși suprascrie temporar cu `--workspace <name>`.
|
||||
|
||||
## Utilizați resursele SDK (tipuri și configurare)
|
||||
|
||||
Biblioteca twenty-sdk oferă blocuri de bază tipizate și funcții ajutătoare pe care le utilizați în aplicația dvs. Mai jos sunt elementele cheie cu care veți interacționa cel mai des.
|
||||
@@ -282,7 +302,7 @@ Puncte cheie:
|
||||
* `universalIdentifier` trebuie să fie unic și stabil între implementări.
|
||||
* Fiecare câmp necesită un `name`, un `type`, un `label` și propriul `universalIdentifier` stabil.
|
||||
* Matricea `fields` este opțională — puteți defini obiecte fără câmpuri personalizate.
|
||||
* Puteți genera obiecte noi folosind `yarn create-entity`, care vă ghidează prin denumire, câmpuri și relații.
|
||||
* Puteți genera obiecte noi folosind `yarn app:create-entity`, care vă ghidează prin denumire, câmpuri și relații.
|
||||
|
||||
<Note>
|
||||
**Câmpurile de bază sunt create automat.** Când definiți un obiect personalizat, Twenty adaugă automat câmpuri standard precum `name`, `createdAt`, `updatedAt`, `createdBy`, `position` și `deletedAt`. Nu trebuie să le definiți în tabloul `fields` — adăugați doar câmpurile personalizate proprii.
|
||||
@@ -496,7 +516,8 @@ export default defineFunction({
|
||||
{
|
||||
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
|
||||
type: 'databaseEvent',
|
||||
eventName: 'person.created',
|
||||
eventName: 'person.updated',
|
||||
updatedFields: ['name'],
|
||||
},
|
||||
],
|
||||
});
|
||||
@@ -509,21 +530,21 @@ Tipuri comune de declanșatoare:
|
||||
> de ex. `path: '/post-card/create',` -> apel pe `<APP_URL>/s/post-card/create`
|
||||
|
||||
* **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
|
||||
* **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.created`
|
||||
> de ex. `person.updated`
|
||||
|
||||
Notițe:
|
||||
|
||||
* Matricea `triggers` este opțională. Funcțiile fără declanșatoare pot fi folosite ca funcții utilitare apelate de alte funcții.
|
||||
* Puteți combina mai multe tipuri de declanșatoare într-o singură funcție.
|
||||
|
||||
### Route trigger payload
|
||||
### Payload-ul declanșatorului de rută
|
||||
|
||||
<Warning>
|
||||
**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object.
|
||||
**Modificare incompatibilă (v1.16, ianuarie 2026):** Formatul payload-ului declanșatorului de rută s-a schimbat. Înainte de v1.16, parametrii de interogare (query), parametrii de cale și corpul erau trimiși direct ca payload. Începând cu v1.16, acestea sunt incluse într-un obiect structurat `RoutePayload`.
|
||||
|
||||
**Before v1.16:**
|
||||
**Înainte de v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (params) => {
|
||||
@@ -531,7 +552,7 @@ Notițe:
|
||||
};
|
||||
```
|
||||
|
||||
**After v1.16:**
|
||||
**După v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -541,10 +562,10 @@ Notițe:
|
||||
};
|
||||
```
|
||||
|
||||
**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object.
|
||||
**Pentru a migra funcțiile existente:** Actualizează handler-ul pentru a extrage câmpurile din `event.body`, `event.queryStringParameters` sau `event.pathParameters` în loc să le iei direct din obiectul params.
|
||||
</Warning>
|
||||
|
||||
When a route trigger invokes your function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`:
|
||||
Când un declanșator de rută îți apelează funcția, aceasta primește un obiect `RoutePayload` care urmează formatul AWS HTTP API v2. Importă tipul din `twenty-sdk`:
|
||||
|
||||
```typescript
|
||||
import { defineFunction, type RoutePayload } from 'twenty-sdk';
|
||||
@@ -560,21 +581,21 @@ const handler = async (event: RoutePayload) => {
|
||||
};
|
||||
```
|
||||
|
||||
The `RoutePayload` type has the following structure:
|
||||
Tipul `RoutePayload` are următoarea structură:
|
||||
|
||||
| Property | Tip | Descriere |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query string parameters (multiple values joined with commas) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
|
||||
| `corp` | `object \| null` | Parsed request body (JSON) |
|
||||
| `isBase64Encoded` | `boolean` | Whether the body is base64 encoded |
|
||||
| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Raw request path |
|
||||
| Proprietate | Tip | Descriere |
|
||||
| ---------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| `headers` | `Record<string, string \| undefined>` | Anteturi HTTP (doar cele listate în `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Parametri query string (valorile multiple unite cu virgule) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Parametri de cale extrași din modelul rutei (de ex., `/users/:id` → `{ id: '123' }`) |
|
||||
| `corp` | `object \| null` | Corpul cererii analizat (JSON) |
|
||||
| `isBase64Encoded` | `boolean` | Indică dacă corpul este codificat în base64 |
|
||||
| `requestContext.http.method` | `string` | Metoda HTTP (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `string` | Calea brută a cererii |
|
||||
|
||||
### Forwarding HTTP headers
|
||||
### Transmiterea anteturilor HTTP
|
||||
|
||||
By default, HTTP headers from incoming requests are **not** passed to your serverless function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array:
|
||||
În mod implicit, anteturile HTTP din cererile de intrare **nu** sunt transmise funcției tale serverless din motive de securitate. Pentru a accesa anumite anteturi, listează-le explicit în array-ul `forwardedRequestHeaders`:
|
||||
|
||||
```typescript
|
||||
export default defineFunction({
|
||||
@@ -594,7 +615,7 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
In your handler, you can then access these headers:
|
||||
În handler, poți apoi accesa aceste anteturi:
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -607,17 +628,17 @@ const handler = async (event: RoutePayload) => {
|
||||
```
|
||||
|
||||
<Note>
|
||||
Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`).
|
||||
Numele anteturilor sunt normalizate la litere mici. Accesează-le folosind chei cu litere mici (de exemplu, `event.headers['content-type']`).
|
||||
</Note>
|
||||
|
||||
Puteți crea funcții noi în două moduri:
|
||||
|
||||
* **Generat**: Rulați `yarn create-entity` și alegeți opțiunea de a adăuga o funcție nouă. Aceasta generează un fișier inițial cu un handler și o configurație.
|
||||
* **Generat**: Rulați `yarn app:create-entity` și alegeți opțiunea de a adăuga o funcție nouă. Aceasta generează un fișier inițial cu un handler și o configurație.
|
||||
* **Manual**: Creați un fișier nou `*.function.ts` și folosiți `defineFunction()`, urmând același model.
|
||||
|
||||
### Client tipizat generat
|
||||
|
||||
Rulați yarn generate pentru a crea un client tipizat local în generated/, pe baza schemei spațiului de lucru. Folosiți-l în funcțiile dvs.:
|
||||
Rulați yarn app:generate pentru a crea un client tipizat local în generated/, pe baza schemei spațiului de lucru. Folosiți-l în funcțiile dvs.:
|
||||
|
||||
```typescript
|
||||
import Twenty from './generated';
|
||||
@@ -626,7 +647,7 @@ const client = new Twenty();
|
||||
const { me } = await client.query({ me: { id: true, displayName: true } });
|
||||
```
|
||||
|
||||
Clientul este regenerat de `yarn generate`. Rulați din nou după ce vă modificați obiectele și rulați `yarn sync` sau când vă integrați într-un spațiu de lucru nou.
|
||||
Clientul este regenerat de `yarn app:generate`. Rulați din nou după ce vă modificați obiectele și rulați `yarn app:sync` sau când vă integrați într-un spațiu de lucru nou.
|
||||
|
||||
#### Acreditări la runtime în funcțiile serverless
|
||||
|
||||
@@ -670,13 +691,13 @@ Apoi adăugați scripturi ca acestea:
|
||||
}
|
||||
```
|
||||
|
||||
Acum puteți rula aceleași comenzi prin Yarn, de ex. `yarn dev`, `yarn sync`, etc.
|
||||
Acum puteți rula aceleași comenzi prin Yarn, de ex. `yarn app:dev`, `yarn app:sync`, etc.
|
||||
|
||||
## Depanare
|
||||
|
||||
* Erori de autentificare: rulați `yarn auth` și asigurați-vă că cheia API are permisiunile necesare.
|
||||
* Erori de autentificare: rulați `yarn auth:login` și asigurați-vă că cheia API are permisiunile necesare.
|
||||
* Nu se poate conecta la server: verificați URL-ul API și că serverul Twenty este accesibil.
|
||||
* Tipuri sau client lipsă/învechite: rulați `yarn generate` și apoi `yarn dev`.
|
||||
* Modul dev nu sincronizează: asigurați-vă că `yarn dev` rulează și că modificările nu sunt ignorate de mediul dvs.
|
||||
* Tipuri sau client lipsă/învechite: rulați `yarn app:generate` și apoi `yarn app:dev`.
|
||||
* Modul dev nu sincronizează: asigurați-vă că `yarn app:dev` rulează și că modificările nu sunt ignorate de mediul dvs.
|
||||
|
||||
Canal de ajutor pe Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
|
||||
@@ -292,31 +292,31 @@ yarn command:prod cron:workflow:automated-cron-trigger
|
||||
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
|
||||
</Warning>
|
||||
|
||||
## Serverless Functions
|
||||
## Funcții serverless
|
||||
|
||||
Twenty supports serverless functions for workflows and custom logic. The execution environment is configured via the `SERVERLESS_TYPE` environment variable.
|
||||
Twenty acceptă funcții serverless pentru fluxuri de lucru și logică personalizată. Mediul de execuție este configurat prin variabila de mediu `SERVERLESS_TYPE`.
|
||||
|
||||
<Warning>
|
||||
**Security Notice:** The local serverless driver (`SERVERLESS_TYPE=LOCAL`) runs code directly on the host in a Node.js process with no sandboxing. It should only be used for trusted code in development. For production deployments handling untrusted code, we highly recommend using `SERVERLESS_TYPE=LAMBDA` or `SERVERLESS_TYPE=DISABLED`.
|
||||
**Atenționare de securitate:** Driverul serverless local (`SERVERLESS_TYPE=LOCAL`) rulează codul direct pe gazdă într-un proces Node.js, fără sandboxing. Ar trebui utilizat doar pentru cod de încredere, în dezvoltare. Pentru implementări de producție care gestionează cod neverificat, recomandăm cu tărie utilizarea `SERVERLESS_TYPE=LAMBDA` sau `SERVERLESS_TYPE=DISABLED`.
|
||||
</Warning>
|
||||
|
||||
### Available Drivers
|
||||
### Drivere disponibile
|
||||
|
||||
| Driver | Environment Variable | Caz de utilizare | Security Level |
|
||||
| -------- | -------------------------- | ------------------------------------- | ------------------------------- |
|
||||
| Disabled | `SERVERLESS_TYPE=DISABLED` | Disable serverless functions entirely | N/A |
|
||||
| Local | `SERVERLESS_TYPE=LOCAL` | Development and trusted environments | Low (no sandboxing) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production with untrusted code | High (hardware-level isolation) |
|
||||
| Driver | Variabilă de mediu | Caz de utilizare | Nivel de securitate |
|
||||
| ---------- | -------------------------- | ----------------------------------------- | -------------------------------------- |
|
||||
| Dezactivat | `SERVERLESS_TYPE=DISABLED` | Dezactivează complet funcțiile serverless | N/A |
|
||||
| Local | `SERVERLESS_TYPE=LOCAL` | Dezvoltare și medii de încredere | Scăzut (fără sandboxing) |
|
||||
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producție cu cod neverificat | Ridicat (izolare la nivel de hardware) |
|
||||
|
||||
### Recommended Configuration
|
||||
### Configurație recomandată
|
||||
|
||||
**For development:**
|
||||
**Pentru dezvoltare:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LOCAL # default
|
||||
```
|
||||
|
||||
**For production (AWS):**
|
||||
**Pentru producție (AWS):**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=LAMBDA
|
||||
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
|
||||
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
|
||||
```
|
||||
|
||||
**To disable serverless functions:**
|
||||
**Pentru a dezactiva funcțiile serverless:**
|
||||
|
||||
```bash
|
||||
SERVERLESS_TYPE=DISABLED
|
||||
```
|
||||
|
||||
<Note>
|
||||
When using `SERVERLESS_TYPE=DISABLED`, any attempt to execute a serverless function will return an error. This is useful if you want to run Twenty without serverless function capabilities.
|
||||
Când se utilizează `SERVERLESS_TYPE=DISABLED`, orice încercare de a executa o funcție serverless va returna o eroare. Acest lucru este util dacă doriți să rulați Twenty fără capabilități de funcții serverless.
|
||||
</Note>
|
||||
|
||||
@@ -1,275 +1,275 @@
|
||||
---
|
||||
title: Chart Settings
|
||||
description: Configure your charts to display data exactly how you need it.
|
||||
title: Setări pentru diagrame
|
||||
description: Configurați diagramele pentru a afișa datele exact așa cum aveți nevoie.
|
||||
---
|
||||
|
||||
import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
## Accessing Chart Settings
|
||||
## Accesarea setărilor pentru diagrame
|
||||
|
||||
1. Click the **Edit** button in the top-right corner of your dashboard
|
||||
1. Faceți clic pe butonul **Editare** din colțul din dreapta sus al tabloului de bord
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Edit mode" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-edit.png" alt="Mod editare" />
|
||||
|
||||
2. The dashboard enters edit mode
|
||||
3. Click on any widget to select it
|
||||
4. The settings panel opens on the right
|
||||
2. Tabloul de bord intră în modul de editare
|
||||
3. Faceți clic pe orice widget pentru a-l selecta
|
||||
4. Panoul de setări se deschide în dreapta
|
||||
|
||||
Settings are organized into sections:
|
||||
Setările sunt organizate în secțiuni:
|
||||
|
||||
* **Data**: What data to pull and how to filter it
|
||||
* **X axis**: How to group and sort categories (bar/line charts)
|
||||
* **Y axis**: What to measure and how to display it (bar/line charts)
|
||||
* **Style**: Colors, labels, and visual options
|
||||
* **Date**: Ce date să preluați și cum să le filtrați
|
||||
* **Axa X**: Cum să grupați și să sortați categoriile (diagrame cu bare/linii)
|
||||
* **Axa Y**: Ce să măsurați și cum să o afișați (diagrame cu bare/linii)
|
||||
* **Stil**: Culori, etichete și opțiuni vizuale
|
||||
|
||||
<Note>
|
||||
Some settings only appear when other settings are configured. For example, **Date granularity** only appears when you select a date field.
|
||||
Unele setări apar doar când sunt configurate alte setări. De exemplu, **Granularitate dată** apare doar când selectați un câmp de tip dată.
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
## Data Settings
|
||||
## Setări date
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Source </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="database" />Sursă </span>
|
||||
|
||||
Choose which object to pull data from.
|
||||
Alegeți din ce obiect să preluați date.
|
||||
|
||||
1. Click **Source**
|
||||
2. Select an object (Opportunities, People, Companies, etc.)
|
||||
1. Faceți clic pe **Sursă**
|
||||
2. Selectați un obiect (Oportunități, Persoane, Companii etc.)
|
||||
|
||||
All your standard and custom objects are available. Changing the source resets other settings since field options depend on the selected object.
|
||||
Toate obiectele standard și personalizate sunt disponibile. Schimbarea sursei resetează alte setări, deoarece opțiunile câmpului depind de obiectul selectat.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-source.png" alt="Sursă" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filter </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filter" />Filtru </span>
|
||||
|
||||
Limit which records are included in the chart.
|
||||
Limitați ce înregistrări sunt incluse în diagramă.
|
||||
|
||||
1. Faceți clic pe **Filtru**
|
||||
2. The filter builder opens
|
||||
3. Click **+ Add filter**
|
||||
4. Select a field, condition, and value
|
||||
5. Add more filters as needed
|
||||
2. Se deschide constructorul de filtre
|
||||
3. Faceți clic pe **+ Adaugă filtru**
|
||||
4. Selectați un câmp, o condiție și o valoare
|
||||
5. Adăugați mai multe filtre după necesități
|
||||
|
||||
Filters work the same as in table views. Use them to focus on specific segments of your data.
|
||||
Filtrele funcționează la fel ca în vizualizările de tabel. Folosiți-le pentru a vă concentra pe segmente specifice ale datelor.
|
||||
|
||||
**Example**: Filter opportunities where Stage equals "Won" to show only closed deals.
|
||||
**Exemplu**: Filtrați oportunitățile unde Etapa este egală cu "Câștigat" pentru a afișa doar tranzacțiile închise.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-filters.png" alt="Filtru" />
|
||||
|
||||
<Tip>
|
||||
For date fields, try **Is relative** to create dynamic filters like "Past 7 days" or "This month" that automatically update.
|
||||
Pentru câmpurile de tip dată, încercați **Este relativ** pentru a crea filtre dinamice precum "Ultimele 7 zile" sau "Luna aceasta" care se actualizează automat.
|
||||
</Tip>
|
||||
|
||||
<Tip>
|
||||
Advanced filters are supported—add multiple filter rules and combine them with **And** or **Or** logic.
|
||||
Filtrele avansate sunt acceptate—adăugați mai multe reguli de filtrare și combinați-le cu logica **Și** sau **Sau**.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## X Axis Settings
|
||||
## Setări axa X
|
||||
|
||||
These settings control the horizontal axis of bar and line charts—typically how your data is grouped into categories.
|
||||
Aceste setări controlează axa orizontală a diagramelor cu bare și linii—de obicei modul în care datele sunt grupate în categorii.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-x" />Date afișate </span>
|
||||
|
||||
Select the field to group your data by. This determines the categories shown on the X axis.
|
||||
Selectați câmpul după care să grupați datele. Aceasta determină categoriile afișate pe axa X.
|
||||
|
||||
**Example**: Select "Stage" to see data grouped by pipeline stage, or "Created date" to see data over time.
|
||||
**Exemplu**: Selectați "Etapă" pentru a vedea datele grupate după etapa din pipeline, sau "Data creării" pentru a vedea datele în timp.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-data-on-display.png" alt="Date afișate" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Granularitate dată </span>
|
||||
|
||||
When grouping by a date field, choose the time period for grouping.
|
||||
Când grupați după un câmp de tip dată, alegeți perioada de timp pentru grupare.
|
||||
|
||||
| Opțiune | Groups data by | Example output |
|
||||
| ------------------- | -------------------- | --------------------------------------------- |
|
||||
| **Day** | Each calendar day | Jan 1, Jan 2, Jan 3... |
|
||||
| **Week** | Calendar weeks | Week 1, Week 2, Week 3... |
|
||||
| **Month** | Calendar months | January, February, March... |
|
||||
| **Quarter** | Fiscal quarters | Q1, Q2, Q3, Q4 |
|
||||
| **Year** | Calendar years | 2023, 2024, 2025 |
|
||||
| **Day of week** | Weekday (aggregated) | Monday, Tuesday... (all Mondays combined) |
|
||||
| **Month of year** | Month (aggregated) | January, February... (all Januaries combined) |
|
||||
| **Quarter of year** | Quarter (aggregated) | Q1, Q2, Q3, Q4 (all Q1s combined) |
|
||||
| Opțiune | Grupează datele după | Exemplu de rezultat |
|
||||
| --------------------- | ------------------------- | -------------------------------------------------------- |
|
||||
| **Zi** | Fiecare zi calendaristică | 1 ian., 2 ian., 3 ian... |
|
||||
| **Săptămână** | Săptămâni calendaristice | Săptămâna 1, Săptămâna 2, Săptămâna 3... |
|
||||
| **Lună** | Luni calendaristice | Ianuarie, Februarie, Martie... |
|
||||
| **Trimestru** | Trimestre fiscale | T1, T2, T3, T4 |
|
||||
| **An** | Ani calendaristici | 2023, 2024, 2025 |
|
||||
| **Ziua săptămânii** | Zi a săptămânii (agregat) | Luni, Marți... (toate zilele de luni combinate) |
|
||||
| **Luna anului** | Lună (agregat) | Ianuarie, Februarie... (toate lunile ianuarie combinate) |
|
||||
| **Trimestrul anului** | Trimestru (agregat) | T1, T2, T3, T4 (toate T1 combinate) |
|
||||
|
||||
The "of week/year" options aggregate across all time. Use **Day of week** to see which weekday typically gets the most deals. Use **Month** to see trends month by month.
|
||||
Opțiunile "din săptămână/an" agregă pe întreaga perioadă de timp. Folosiți **Ziua săptămânii** pentru a vedea în ce zi din săptămână se obțin de obicei cele mai multe tranzacții. Folosiți **Lună** pentru a vedea tendințele lună de lună.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sortează după </span>
|
||||
|
||||
Control the order of categories on the X axis.
|
||||
Controlați ordinea categoriilor pe axa X.
|
||||
|
||||
* **Position** – Uses the order defined in your Select field settings
|
||||
* **Alphabetical** – A to Z (or chronological for dates)
|
||||
* **By value** – Ordered by the metric (highest or lowest first)
|
||||
* **Manual** – Drag to set your own order
|
||||
* **Poziție** – Folosește ordinea definită în setările câmpului Select
|
||||
* **Alfabetic** – de la A la Z (sau cronologic pentru date)
|
||||
* **După valoare** – Ordonat după metrică (mai întâi cele mai mari sau cele mai mici)
|
||||
* **Manual** – Trageți pentru a stabili propria ordine
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-x-sort.png" alt="Sortează după" />
|
||||
|
||||
**Tip**: For pipeline stages, use **Position** to show stages in your sales process order (Lead → Qualified → Proposal → Won).
|
||||
**Sfat**: Pentru etapele din pipeline, utilizați **Poziție** pentru a afișa etapele în ordinea procesului de vânzări (Potențial → Calificat → Ofertă → Câștigat).
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field type. Select fields have all options; date and text fields show fewer.
|
||||
Opțiunile afișate depind de tipul câmpului. Câmpurile de tip Select au toate opțiunile; câmpurile de tip dată și text afișează mai puține.
|
||||
</Note>
|
||||
|
||||
<Tip>
|
||||
With **Manual** sorting, drag categories to create a custom order—perfect for highlighting specific segments or telling a story with your data.
|
||||
Cu sortarea **Manual**, trageți categoriile pentru a crea o ordine personalizată—perfect pentru a evidenția segmente specifice sau pentru a spune o poveste cu datele dvs.
|
||||
</Tip>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Omit zero values </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="eye-off" />Omite valorile zero </span>
|
||||
|
||||
Hide categories that have zero or no data.
|
||||
Ascundeți categoriile care au valoare zero sau nu au date.
|
||||
|
||||
* **On**: Categories with no records are hidden
|
||||
* **Off**: All categories are shown, even if empty
|
||||
* **Activat**: Categoriile fără înregistrări sunt ascunse
|
||||
* **Dezactivat**: Toate categoriile sunt afișate, chiar dacă sunt goale
|
||||
|
||||
Use this to clean up charts with sparse data.
|
||||
Folosiți această opțiune pentru a curăța diagramele cu date rare.
|
||||
|
||||
---
|
||||
|
||||
## Y Axis Settings
|
||||
## Setări axa Y
|
||||
|
||||
These settings control what you're measuring and how it's displayed.
|
||||
Aceste setări controlează ce măsurați și cum este afișat.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Data on display </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="axis-y" />Date afișate </span>
|
||||
|
||||
Select the field and operation to calculate your metric.
|
||||
Selectați câmpul și operația pentru a calcula metrica.
|
||||
|
||||
* **Counts** – Count all, Count empty, Count not empty, Count unique values
|
||||
* **Math** – Sum, Average, Min, Max (number fields)
|
||||
* **Percentages** – Percent empty, Percent not empty
|
||||
* **Numărări** – Numără toate, Numără gol, Numără ne-gol, Numără valori unice
|
||||
* **Matematică** – Sumă, Medie, Minim, Maxim (câmpuri numerice)
|
||||
* **Procente** – Procent gol, Procent ne-gol
|
||||
|
||||
Boolean fields add Count true/false. Aggregate charts with date fields show Earliest/Latest.
|
||||
Câmpurile booleene adaugă Numără adevărat/fals. Diagramele agregate cu câmpuri de tip dată afișează Cel mai timpuriu/Cel mai târziu.
|
||||
|
||||
**Example**: Select "Amount" with Sum to see total deal value per category, or Count all to see number of deals.
|
||||
**Exemplu**: Selectați "Sumă" cu operația Sumă pentru a vedea valoarea totală a tranzacțiilor pe categorie, sau Numără toate pentru a vedea numărul de tranzacții.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-data-on-display.png" alt="Date afișate" />
|
||||
|
||||
<Note>
|
||||
The options shown depend on your field and chart type. If you don't see an expected operation, check your field type.
|
||||
Opțiunile afișate depind de câmpul și tipul de diagramă. Dacă nu vedeți o operație așteptată, verificați tipul câmpului.
|
||||
</Note>
|
||||
|
||||
### Raport
|
||||
|
||||
For Select, Multi-select, or Boolean fields, you can calculate the percentage of a specific value.
|
||||
Pentru câmpuri de tip Select, Multi-select sau Boolean, puteți calcula procentul unei valori specifice.
|
||||
|
||||
1. Select a Select, Multi-select, or Boolean field
|
||||
2. Enable **Ratio**
|
||||
3. Choose the option to measure
|
||||
1. Selectați un câmp de tip Select, Multi-select sau Boolean
|
||||
2. Activați **Raport**
|
||||
3. Alegeți opțiunea de măsurat
|
||||
|
||||
**Example**: Show "Won" deals as a percentage of all opportunities. If you have 10 Won out of 50 total, the chart shows 20%.
|
||||
**Exemplu**: Afișați tranzacțiile "Câștigat" ca procent din toate oportunitățile. Dacă aveți 10 Câștigate dintr-un total de 50, diagrama afișează 20%.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Group by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="filters" />Grupează după </span>
|
||||
|
||||
Add a second dimension to create multiple series (multiple bars or lines).
|
||||
Adăugați o a doua dimensiune pentru a crea mai multe serii (mai multe bare sau linii).
|
||||
|
||||
1. Set your X axis field first
|
||||
2. Click **Group by**
|
||||
3. Select a second field
|
||||
1. Stabiliți mai întâi câmpul pentru axa X
|
||||
2. Faceți clic pe **Grupează după**
|
||||
3. Selectați un al doilea câmp
|
||||
|
||||
**Example**: Group deals by Stage (X axis) AND by Owner (Group by) to see each person's pipeline breakdown side by side.
|
||||
**Exemplu**: Grupați tranzacțiile după Etapă (axa X) ȘI după Proprietar (Grupează după) pentru a vedea alăturat distribuția pipeline-ului fiecărei persoane.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-group-by.png" alt="Grupare după" />
|
||||
|
||||
When Group by is set, you'll see multiple colors in your chart and a legend appears.
|
||||
Când Grupează după este setat, veți vedea mai multe culori în diagramă și apare o legendă.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Date granularity </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="calendar" />Granularitate dată </span>
|
||||
|
||||
When Group by is a date field, choose the time period (same options as X axis).
|
||||
Când Grupează după este un câmp de tip dată, alegeți perioada de timp (aceleași opțiuni ca pentru axa X).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sort by </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="arrows-sort" />Sortează după </span>
|
||||
|
||||
When **Group by** is set, control the order of grouped series (e.g., which owner's bar appears first within each category).
|
||||
Când **Grupează după** este setat, controlați ordinea seriilor grupate (de ex., bara cărui proprietar apare prima în fiecare categorie).
|
||||
|
||||
Same options as X axis sorting—Position, Alphabetical, and Manual—except **value-based sorting is not available** for secondary grouping.
|
||||
Aceleași opțiuni ca sortarea pe axa X—Poziție, Alfabetic și Manual—cu excepția faptului că **sortarea bazată pe valori nu este disponibilă** pentru gruparea secundară.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Cumulative </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="chart-bar-popular" />Cumulativ </span>
|
||||
|
||||
Show running totals instead of individual values.
|
||||
Afișați totaluri cumulative în locul valorilor individuale.
|
||||
|
||||
* **Off**: Each bar/point shows its own value
|
||||
* **On**: Each bar/point shows the sum of all previous values plus its own
|
||||
* **Dezactivat**: Fiecare bară/punct își afișează propria valoare
|
||||
* **Activ**: Fiecare bară/punct afișează suma tuturor valorilor anterioare plus propria valoare
|
||||
|
||||
**Example**: January = 10, February = 15
|
||||
**Exemplu**: Ianuarie = 10, Februarie = 15
|
||||
|
||||
* Cumulative off: Shows 10 and 15
|
||||
* Cumulative on: Shows 10 and 25 (10 + 15)
|
||||
* Cumulativ dezactivat: Afișează 10 și 15
|
||||
* Cumulativ activ: Afișează 10 și 25 (10 + 15)
|
||||
|
||||
Use cumulative to track progress toward a goal over time.
|
||||
Folosiți opțiunea Cumulativ pentru a urmări progresul către un obiectiv în timp.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-chart-settings-y-cumulative.png" alt="Cumulativ" />
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Min range / <ChartIcon icon="math-max" />Max range </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="math-min" />Interval minim / <ChartIcon icon="math-max" />Interval maxim </span>
|
||||
|
||||
Set fixed minimum and maximum values for the Y axis.
|
||||
Stabiliți valori minime și maxime fixe pentru axa Y.
|
||||
|
||||
* Leave blank for automatic scaling
|
||||
* Enter a number to fix the boundary
|
||||
* Lăsați necompletat pentru scalare automată
|
||||
* Introduceți un număr pentru a fixa limita
|
||||
|
||||
**When to use:**
|
||||
**Când se folosește:**
|
||||
|
||||
* Set Min to 0 for accurate visual comparisons
|
||||
* Set both for consistent scales across multiple charts
|
||||
* Focus on a specific value range by setting both
|
||||
* Setați Min la 0 pentru comparații vizuale corecte
|
||||
* Setați ambele pentru scări consistente între mai multe diagrame
|
||||
* Concentrați-vă pe un interval de valori specific setând ambele
|
||||
|
||||
---
|
||||
|
||||
## Style Settings
|
||||
## Setări de stil
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Colors </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="color-swatch" />Culori </span>
|
||||
|
||||
Set the color scheme for your chart. Choose from a variety of color palettes.
|
||||
Setați schema de culori pentru diagrama dvs. Alegeți dintr-o varietate de palete de culori.
|
||||
|
||||
<Note>
|
||||
When grouping by a Select field, the chart automatically uses the colors defined for each option in your field settings.
|
||||
Când grupați după un câmp de tip Select, diagrama folosește automat culorile definite pentru fiecare opțiune în setările câmpului.
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Axis name </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="gizmo" />Numele axei </span>
|
||||
|
||||
Choose which axis labels to show: **None**, **X axis**, **Y axis**, or **Both** (bar and line charts only).
|
||||
Alegeți ce etichete de axă să afișați: **Niciuna**, **Axa X**, **Axa Y**, sau **Ambele** (numai pentru diagrame cu bare și linii).
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Stacked bars / Stacked lines </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="stack-2" />Bare stivuite / Linii stivuite </span>
|
||||
|
||||
When Group by is set, choose how multiple series are displayed.
|
||||
Când Grupează după este setat, alegeți cum sunt afișate mai multe serii.
|
||||
|
||||
* **Off (Grouped)**: Series appear side by side. Use when comparing exact values between groups.
|
||||
* **On (Stacked)**: Series stack on top of each other. Use when showing composition—how parts make up a whole.
|
||||
* **Dezactivat (Grupate)**: Seriile apar una lângă alta. Folosiți când comparați valori exacte între grupuri.
|
||||
* **Activ (Stivuite)**: Seriile se stivuiesc una peste alta. Folosiți când arătați compoziția—cum părțile formează un întreg.
|
||||
|
||||
**Example**: Deals by stage, grouped by owner
|
||||
**Exemplu**: Tranzacții după etapă, grupate după proprietar
|
||||
|
||||
* Grouped: See each owner's exact numbers side by side
|
||||
* Stacked: See total deals per stage, with each owner's contribution stacked
|
||||
* Grupate: Vedeți numerele exacte ale fiecărui proprietar una lângă alta
|
||||
* Stivuite: Vedeți totalul tranzacțiilor pe etapă, cu contribuția fiecărui proprietar stivuită
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Data labels </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="badge-2k" />Etichete de date </span>
|
||||
|
||||
Show values directly on chart elements (bars, points, slices).
|
||||
Afișați valorile direct pe elementele diagramei (bare, puncte, segmente).
|
||||
|
||||
* **On**: Values appear on the chart
|
||||
* **Off**: No values shown (cleaner look)
|
||||
* **Activ**: Valorile apar pe diagramă
|
||||
* **Dezactivat**: Nu se afișează valori (aspect mai curat)
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legend </span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}> <ChartIcon icon="text-caption" />Legendă </span>
|
||||
|
||||
Show or hide the legend (only appears when Group by is set).
|
||||
Afișați sau ascundeți legenda (apare doar când Grupează după este setat).
|
||||
|
||||
* **On**: Legend shows what each color represents
|
||||
* **Off**: No legend displayed
|
||||
* **Activ**: Legenda arată ce reprezintă fiecare culoare
|
||||
* **Dezactivat**: Nu se afișează legendă
|
||||
|
||||
<Tip>
|
||||
**Hover** over a legend item to highlight that group. **Click** to temporarily hide it from the chart.
|
||||
**Treceți cursorul** peste un element al legendei pentru a evidenția acel grup. Faceți clic pentru a ascunde temporar acel grup din diagramă.
|
||||
</Tip>
|
||||
|
||||
---
|
||||
|
||||
## Chart-Specific Notes
|
||||
## Note specifice diagramelor
|
||||
|
||||
### Grafice circulare
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Each slice represents** – Define how slices are grouped
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Hide empty category** – Remove zero-value slices
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Show value in center** – Display the aggregate value (sum, average, count, etc.)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="chart-pie" size={16} /></span> **Fiecare segment reprezintă** – Definiți cum sunt grupate segmentele
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="eye-off" size={16} /></span> **Ascunde categoria goală** – Elimină segmentele cu valoare zero
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="number-123" size={16} /></span> **Afișează valoarea în centru** – Afișează valoarea agregată (sumă, medie, număr etc.)
|
||||
|
||||
### Aggregate charts
|
||||
### Diagrame agregate
|
||||
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Add text before the number (e.g., `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Suffix** – Add text after the number (e.g., `%`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-left" size={16} /></span> **Prefix** – Adăugați text înaintea numărului (de ex., `$`)
|
||||
* <span style={{ display: 'inline-flex', verticalAlign: 'middle' }}><ChartIcon icon="caret-right" size={16} /></span> **Sufix** – Adăugați text după număr (de ex., `%`)
|
||||
|
||||
@@ -12,7 +12,7 @@ Tablourile de bord din Twenty sunt organizate într-o ierarhie: **Tablouri de bo
|
||||
1. Accesați **Tablouri de bord** în navigare
|
||||
2. Faceți clic pe **+ Înregistrare nouă**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Create a new dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-create-new.png" alt="Creați un tablou de bord nou" />
|
||||
|
||||
3. Dați un nume tabloului de bord
|
||||
4. Începeți să adăugați file și widgeturi
|
||||
@@ -23,27 +23,27 @@ Filele vă ajută să organizați tabloul de bord în secțiuni logice.
|
||||
|
||||
### Crearea filelor
|
||||
|
||||
1. In edit mode, click **+** in the tab bar, side panel will open on the right
|
||||
1. În modul de editare, faceți clic pe **+** în bara de file, iar panoul lateral se va deschide în dreapta
|
||||
2. Denumiți fila (de ex., "Prezentare generală a pipeline-ului", "Performanța echipei")
|
||||
3. Adăugați widgeturi în filă
|
||||
|
||||
### Reordering Tabs
|
||||
### Reordonarea filelor
|
||||
|
||||
1. In edit mode, click and hold on the tab you want to move
|
||||
2. Drag and drop to the new position
|
||||
3. You can also click on the tab and use the command menu to move the tab to left or right
|
||||
1. În modul de editare, faceți clic și mențineți apăsat pe fila pe care doriți să o mutați
|
||||
2. Trageți și plasați în noua poziție
|
||||
3. Puteți, de asemenea, să faceți clic pe filă și să utilizați meniul de comenzi pentru a muta fila la stânga sau la dreapta
|
||||
|
||||
### Deleting Tabs
|
||||
### Ștergerea filelor
|
||||
|
||||
1. In edit mode, click on the tab you want to delete
|
||||
2. Click the **Delete** button in the command menu
|
||||
1. În modul de editare, faceți clic pe fila pe care doriți să o ștergeți
|
||||
2. Faceți clic pe butonul **Ștergere** din meniul de comenzi
|
||||
|
||||
### Duplicarea filelor
|
||||
|
||||
1. Faceți clic pe fila pe care doriți să o duplicați
|
||||
2. Faceți clic pe butonul **Duplicare** din panoul lateral
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Dashboard tab" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-tabs.png" alt="Filă de tablou de bord" />
|
||||
|
||||
## Aspectul tabloului de bord
|
||||
|
||||
@@ -55,11 +55,11 @@ Filele vă ajută să organizați tabloul de bord în secțiuni logice.
|
||||
|
||||
### Duplicarea unui tablou de bord
|
||||
|
||||
1. Select the dashboard you want to duplicate
|
||||
1. Selectați tabloul de bord pe care doriți să îl duplicați
|
||||
2. Deschideți bara de comenzi cu **Cmd + K** (sau **Ctrl + K** pe Windows)
|
||||
3. Selectați **Duplicare tablou de bord**
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplicate a dashboard" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-duplicate.png" alt="Duplicați un tablou de bord" />
|
||||
|
||||
### Cele mai bune practici
|
||||
|
||||
|
||||
@@ -9,12 +9,12 @@ import { ChartIcon } from '/snippets/chart-icon.mdx';
|
||||
|
||||
Twenty oferă diverse tipuri de widgeturi pentru a vă vizualiza datele CRM.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Bar Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-bar-popular" />Grafice cu bare</span>
|
||||
|
||||
Afișează datele sub formă de bare orizontale sau verticale.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Bar chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-bar-chart.png" alt="Grafic cu bare" />
|
||||
</Frame>
|
||||
|
||||
**Cel mai potrivit pentru:**
|
||||
@@ -30,15 +30,15 @@ Afișează datele sub formă de bare orizontale sau verticale.
|
||||
* Contacte adăugate pe lună
|
||||
|
||||
<Note>
|
||||
**Display limits**: Bar charts can show a maximum of 100 bars, and 50 groups per bar when using Group By. Dacă vedeți avertismentul "Date neafișate: max X bare pe grafic", adăugați filtre pentru a restrânge datele sau schimbați gruparea (de ex., grupați pe săptămână în loc de zile).
|
||||
**Limite de afișare**: Graficele cu bare pot afișa maximum 100 de bare și 50 de grupuri pentru fiecare bară când se utilizează Group By. Dacă vedeți avertismentul "Date neafișate: max X bare pe grafic", adăugați filtre pentru a restrânge datele sau schimbați gruparea (de ex., grupați pe săptămână în loc de zile).
|
||||
</Note>
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Pie Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-pie" />Grafice circulare</span>
|
||||
|
||||
Afișează proporțiile dintr-un întreg.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Pie chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-pie-chart.png" alt="Grafic circular" />
|
||||
</Frame>
|
||||
|
||||
**Cel mai potrivit pentru:**
|
||||
@@ -53,12 +53,12 @@ Afișează proporțiile dintr-un întreg.
|
||||
* Defalcarea contactelor după industrie
|
||||
* Compoziția pipeline-ului după proprietar
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Line Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="chart-line" />Grafice liniare</span>
|
||||
|
||||
Afișează tendințele în timp.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Line chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-line-chart.png" alt="Grafic liniar" />
|
||||
</Frame>
|
||||
|
||||
**Cel mai potrivit pentru:**
|
||||
@@ -73,12 +73,12 @@ Afișează tendințele în timp.
|
||||
* Creșterea veniturilor pe trimestre
|
||||
* Nivelurile de activitate în timp
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Aggregate Charts</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="sum" />Diagrame agregate</span>
|
||||
|
||||
Afișează proeminent valori cheie unice.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Aggregate chart" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-aggregate-chart.png" alt="Diagramă agregată" />
|
||||
</Frame>
|
||||
|
||||
**Cel mai potrivit pentru:**
|
||||
@@ -98,7 +98,7 @@ Afișează proeminent valori cheie unice.
|
||||
* **Ratio**: Pentru câmpurile Select, calculați rapoarte între valori. Accesați **Data on display** → selectați câmpul → activați opțiunea **Ratio**.
|
||||
* **Prefix și Sufix**: Adăugați text personalizat înainte sau după număr (de ex., prefix "$" sau sufix "%") pentru o lizibilitate mai bună.
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="frame" />iFrames</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="frame" />iFrame-uri</span>
|
||||
|
||||
Încorporați instrumente externe și conținut extern direct în tabloul de bord.
|
||||
|
||||
@@ -118,25 +118,25 @@ Afișează proeminent valori cheie unice.
|
||||
* Indicatori din dialer
|
||||
* Conținut în timp real din instrumentul de secvențe de vânzări
|
||||
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Rich Text</span>
|
||||
### <span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}><ChartIcon icon="align-box-left-top" />Text îmbogățit</span>
|
||||
|
||||
Add formatted text and content directly to your dashboard.
|
||||
Adăugați text formatat și conținut direct în tabloul de bord.
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Rich text" />
|
||||
<img src="/images/user-guide/dashboard/dashboard-widget-rich-text.png" alt="Text îmbogățit" />
|
||||
</Frame>
|
||||
|
||||
**Cel mai potrivit pentru:**
|
||||
|
||||
* Adding context or instructions
|
||||
* Dashboard descriptions
|
||||
* Notes and annotations
|
||||
* Adăugarea de context sau instrucțiuni
|
||||
* Descrieri ale tabloului de bord
|
||||
* Note și adnotări
|
||||
|
||||
**Features:**
|
||||
**Funcționalități:**
|
||||
|
||||
* Rich text formatting (bold, italic, lists, etc.)
|
||||
* Image and file uploads
|
||||
* Markdown-style editing
|
||||
* Formatare de tip text îmbogățit (aldin, cursiv, liste etc.)
|
||||
* Încărcarea imaginilor și fișierelor
|
||||
* Editare în stil Markdown
|
||||
|
||||
<Note>
|
||||
**În curând**: Graficele tip indicator (gauge) și tabelele nu sunt încă disponibile, dar se află pe foaia noastră de parcurs.
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
---
|
||||
title: Widget FAQ
|
||||
description: Common questions and error messages explained.
|
||||
title: Întrebări frecvente despre widget
|
||||
description: Întrebări comune și mesaje de eroare explicate.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="How do I show percentages instead of counts?">
|
||||
Three options:
|
||||
<Accordion title="Cum afișez procente în loc de numărări?">
|
||||
Trei opțiuni:
|
||||
|
||||
* **Percent empty/not empty**: Under Data on display, select Percent empty or Percent not empty
|
||||
* **Ratio**: For Select or Checkbox fields, enable Ratio to show a specific option as a percentage of all records
|
||||
* **Suffix**: For aggregate charts, add `%` as a Suffix in Style settings
|
||||
* **Procent gol/completat**: În Date afișate, selectează Procent gol sau Procent completat
|
||||
* **Raport**: Pentru câmpurile Select sau Checkbox, activează Raport pentru a afișa o opțiune specifică drept procent din toate înregistrările
|
||||
* **Sufix**: Pentru diagrame agregate, adaugă `%` ca Sufix în Setările de stil
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between grouped and stacked bars?">
|
||||
When using **Group by**, you can display series two ways:
|
||||
<Accordion title="Care este diferența dintre bare grupate și stivuite?">
|
||||
Când folosești **Grupează după**, poți afișa seriile în două moduri:
|
||||
|
||||
* **Grouped**: Bars side by side—best for comparing exact values
|
||||
* **Stacked**: Bars on top of each other—best for showing composition
|
||||
* **Grupate**: Bare alăturate—cel mai bine pentru compararea valorilor exacte
|
||||
* **Stivuite**: Bare una peste alta—cel mai bine pentru a arăta compoziția
|
||||
|
||||
Toggle **Stacked** in Style settings to switch.
|
||||
Comută opțiunea **Stivuite** în Setările de stil.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why can't I see Sum or Average options?">
|
||||
Available operations depend on **field type**:
|
||||
<Accordion title="De ce nu văd opțiunile Sumă sau Medie?">
|
||||
Operațiunile disponibile depind de **tipul câmpului**:
|
||||
|
||||
* **Number fields**: Sum, Average, Min, Max
|
||||
* **Date fields**: Earliest, Latest (aggregate charts only)
|
||||
* **Checkbox fields**: Count true, Count false
|
||||
* **Câmpuri numerice**: Sumă, Medie, Minim, Maxim
|
||||
* **Câmpuri de tip dată**: Cel mai devreme, Cel mai târziu (doar pentru diagrame agregate)
|
||||
* **Câmpuri Checkbox**: Număr valori adevărate, Număr valori false
|
||||
|
||||
If you don't see an option, check that you've selected a compatible field type.
|
||||
Dacă nu vezi o opțiune, verifică dacă ai selectat un tip de câmp compatibil.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why are some settings grayed out or missing?">
|
||||
Many settings only appear when prerequisites are met:
|
||||
<Accordion title="De ce unele setări sunt dezactivate sau lipsesc?">
|
||||
Multe setări apar doar când sunt îndeplinite cerințele prealabile:
|
||||
|
||||
* **Date granularity**: Select a date field first
|
||||
* **Group by, Legend, Stacked**: Set Source first
|
||||
* **Legend, Stacked toggles**: Set Group by first
|
||||
* **Granularitatea datei**: Selectează mai întâi un câmp de tip dată
|
||||
* **Grupează după, Legendă, Stivuite**: Setează Sursa mai întâi
|
||||
* **Comutatoarele Legendă și Stivuite**: Setează mai întâi Grupează după
|
||||
|
||||
If a setting is missing, configure its prerequisite first.
|
||||
Dacă lipsește o setare, configurează mai întâi cerința ei prealabilă.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'No data' mean?">
|
||||
The chart found no records matching your configuration.
|
||||
<Accordion title="Ce înseamnă „No data”?">
|
||||
Diagrama nu a găsit înregistrări care să corespundă configurației tale.
|
||||
|
||||
**To fix:** Remove or adjust filters, verify you selected the correct Source object, or check that records exist for your date range.
|
||||
**Pentru remediere:** Elimină sau ajustează filtrele, verifică dacă ai selectat obiectul Sursă corect sau verifică dacă există înregistrări pentru intervalul tău de date.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Invalid configuration' mean?">
|
||||
A required setting is missing or incompatible.
|
||||
<Accordion title="Ce înseamnă „Invalid configuration”?">
|
||||
O setare obligatorie lipsește sau este incompatibilă.
|
||||
|
||||
**To fix:** Ensure Source is set, Data on display is configured, and any required grouping fields are selected.
|
||||
**Pentru remediere:** Asigură-te că Sursa este setată, Datele afișate sunt configurate și orice câmpuri de grupare necesare sunt selectate.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What does 'Undisplayed data' mean?">
|
||||
Your data exceeds display limits (100 bars, 100 data points, or 100 slices).
|
||||
<Accordion title="Ce înseamnă „Undisplayed data”?">
|
||||
Datele tale depășesc limitele de afișare (100 de bare, 100 de puncte de date sau 100 de felii).
|
||||
|
||||
**To fix:** Add filters to narrow your data, or change date granularity from Day to Week or Month.
|
||||
**Pentru remediere:** Adaugă filtre pentru a restrânge datele sau schimbă granularitatea datei din Zi în Săptămână sau Lună.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why is one axis showing no data?">
|
||||
The selected field has no values for the records in your filter, or the field type doesn't match the expected data.
|
||||
<Accordion title="De ce una dintre axe nu afișează date?">
|
||||
Câmpul selectat nu are valori pentru înregistrările din filtrul tău sau tipul câmpului nu se potrivește cu datele așteptate.
|
||||
|
||||
**To fix:** Try a different field, or check that records have values for the selected field.
|
||||
**Pentru remediere:** Încearcă un alt câmp sau verifică dacă înregistrările au valori pentru câmpul selectat.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -40,9 +40,9 @@ Widgeturile sunt vizualizări individuale care afișează date specifice. Tipuri
|
||||
* Grafice cu bare
|
||||
* Grafice circulare
|
||||
* Grafice liniare
|
||||
* Aggregate charts
|
||||
* Diagrame agregate
|
||||
* iFrames
|
||||
* Rich text
|
||||
* Text îmbogățit
|
||||
|
||||
<Note>
|
||||
**Limitări actuale**:
|
||||
@@ -81,5 +81,5 @@ Widgeturile sunt vizualizări individuale care afișează date specifice. Tipuri
|
||||
## Pașii următori
|
||||
|
||||
* [Widgeturi și vizualizări](/l/ro/user-guide/dashboards/capabilities/widgets)
|
||||
* [Chart settings reference](/l/ro/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [Referință pentru setările graficului](/l/ro/user-guide/dashboards/capabilities/chart-settings)
|
||||
* [Întrebări frecvente despre tablourile de bord](/l/ro/user-guide/dashboards/how-tos/dashboards-faq)
|
||||
|
||||
+13
-13
@@ -116,27 +116,27 @@ Echipa
|
||||
* Subiect: Revenire la discuția noastră
|
||||
* Conținut: Faceți referire la detaliile întâlnirii din declanșator
|
||||
|
||||
## Email Attachments
|
||||
## Atașamente pentru e-mailuri
|
||||
|
||||
You can attach files to emails sent from workflows. The attachment is a static file that you upload when configuring the workflow.
|
||||
Puteți atașa fișiere la e-mailurile trimise din fluxuri de lucru. Atașamentul este un fișier static pe care îl încărcați atunci când configurați fluxul de lucru.
|
||||
|
||||
### How to Add an Attachment
|
||||
### Cum să adăugați un atașament
|
||||
|
||||
1. In the **Send Email** action, click on the **Attachments** button
|
||||
2. Click to upload a file from your computer
|
||||
3. The file will be attached to all emails sent by this action
|
||||
1. În acțiunea **Trimite e-mail**, faceți clic pe butonul **Atașamente**
|
||||
2. Faceți clic pentru a încărca un fișier de pe computerul dvs.
|
||||
3. Fișierul va fi atașat tuturor e-mailurilor trimise de această acțiune
|
||||
|
||||
### Cazuri de Utilizare Comune
|
||||
|
||||
| Caz de utilizare | Example File |
|
||||
| ------------------------ | ----------------------------- |
|
||||
| **Welcome emails** | Company brochure (PDF) |
|
||||
| **Onboarding sequences** | Getting started guide |
|
||||
| **Sales follow-ups** | Product catalog or price list |
|
||||
| **Event confirmations** | Event details or agenda |
|
||||
| Caz de utilizare | Exemplu de fișier |
|
||||
| ------------------------------------- | --------------------------------------- |
|
||||
| **E-mailuri de bun venit** | Broșura companiei (PDF) |
|
||||
| **Secvențe de introducere** | Ghid de inițiere |
|
||||
| **Mesaje de urmărire pentru vânzări** | Catalog de produse sau listă de prețuri |
|
||||
| **Confirmări pentru evenimente** | Detalii despre eveniment sau agendă |
|
||||
|
||||
<Note>
|
||||
Attachments are static—the same file is sent to all recipients. For dynamic documents (like personalized quotes), generate and attach files using a [Serverless Function](/l/ro/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
Atașamentele sunt statice — același fișier este trimis tuturor destinatarilor. Pentru documente dinamice (cum ar fi ofertele personalizate), generați și atașați fișiere folosind o [Funcție serverless](/l/ro/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
|
||||
</Note>
|
||||
|
||||
## Cele mai bune practici
|
||||
|
||||
+2
-2
@@ -7,9 +7,9 @@ title: Лучшие практики
|
||||
## Следуйте модульному подходу
|
||||
|
||||
Бэкенд следует модульному подходу, который является основным принципом при работе с NestJS. Убедитесь, что вы разбиваете код на повторно используемые модули, чтобы поддерживать чистую и хорошо организованную кодовую базу.
|
||||
Каждый модуль должен инкапсулировать конкретную функциональность и иметь чётко определённую область ответственности. This modular approach enables clear separation of concerns and removes unnecessary complexities.
|
||||
Каждый модуль должен инкапсулировать конкретную функциональность и иметь чётко определённую область ответственности. Этот модульный подход обеспечивает четкое разделение областей ответственности и устраняет лишние сложности.
|
||||
|
||||
## Expose services to use in modules
|
||||
## Предоставляйте сервисы для использования в модулях
|
||||
|
||||
Всегда создавайте сервисы с одной чёткой областью ответственности, что повышает читаемость и облегчает сопровождение кода. Называйте сервисы понятно и единообразно.
|
||||
|
||||
|
||||
+3
-3
@@ -2,11 +2,11 @@
|
||||
title: Пользовательские объекты
|
||||
---
|
||||
|
||||
Объекты - это структуры, которые позволяют хранить данные (записи, атрибуты и значения), специфичные для организации. Twenty provides both standard and custom objects.
|
||||
Объекты - это структуры, которые позволяют хранить данные (записи, атрибуты и значения), специфичные для организации. В Twenty предусмотрены как стандартные, так и пользовательские объекты.
|
||||
|
||||
Стандартные объекты - это встроенные объекты с набором атрибутов, доступных для всех пользователей. Examples of standard objects in Twenty include Company and Person. Стандартные объекты имеют стандартные поля, которые также доступны всем пользователям Twenty, например, Company.displayName.
|
||||
Стандартные объекты - это встроенные объекты с набором атрибутов, доступных для всех пользователей. В Twenty к стандартным объектам относятся Company и Person. Стандартные объекты имеют стандартные поля, которые также доступны всем пользователям Twenty, например, Company.displayName.
|
||||
|
||||
Пользовательские объекты - это объекты, которые вы можете создать для хранения уникальной информации для вашей организации. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
|
||||
Пользовательские объекты - это объекты, которые вы можете создать для хранения уникальной информации для вашей организации. Они не являются встроенными; участники вашего рабочего пространства могут создавать и настраивать пользовательские объекты для хранения информации, для которой стандартные объекты не подходят.
|
||||
|
||||
## Схема высокого уровня
|
||||
|
||||
|
||||
+6
-6
@@ -1,10 +1,10 @@
|
||||
---
|
||||
title: Feature Flags
|
||||
title: Флаги функций
|
||||
---
|
||||
|
||||
Feature flags are used to hide experimental features. Для Twenty они устанавливаются на уровне рабочей области, а не на уровне пользователя.
|
||||
Флаги функций используются для скрытия экспериментальных функций. Для Twenty они устанавливаются на уровне рабочей области, а не на уровне пользователя.
|
||||
|
||||
## Adding a new feature flag
|
||||
## Добавление нового флага функции
|
||||
|
||||
В `FeatureFlagKey.ts` добавьте флаг функции:
|
||||
|
||||
@@ -23,7 +23,7 @@ enum FeatureFlagKeys {
|
||||
}
|
||||
```
|
||||
|
||||
To apply a feature flag on a **backend** feature use:
|
||||
Чтобы применить флаг функции к **бэкенд**-функции, используйте:
|
||||
|
||||
```ts
|
||||
@Gate({
|
||||
@@ -31,13 +31,13 @@ To apply a feature flag on a **backend** feature use:
|
||||
})
|
||||
```
|
||||
|
||||
To apply a feature flag on a **frontend** feature use:
|
||||
Чтобы применить флаг функции к **фронтенд**-функции, используйте:
|
||||
|
||||
```ts
|
||||
const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
|
||||
```
|
||||
|
||||
## Configure feature flags for the deployment
|
||||
## Настройте флаги функций для развертывания
|
||||
|
||||
Измените соответствующую запись в таблице `core.featureFlag`:
|
||||
|
||||
|
||||
+7
-7
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Архитектура папок
|
||||
info: A detailed look into our server folder architecture
|
||||
info: Подробное рассмотрение нашей архитектуры папок сервера
|
||||
---
|
||||
|
||||
Структура серверной директории следующая:
|
||||
@@ -21,7 +21,7 @@ server
|
||||
└───utils
|
||||
```
|
||||
|
||||
## Ability
|
||||
## Правила доступа
|
||||
|
||||
Определяет разрешения и включает обработчики для каждого объекта.
|
||||
|
||||
@@ -33,13 +33,13 @@ server
|
||||
|
||||
## Фильтры
|
||||
|
||||
Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
|
||||
Включает фильтры исключений для обработки исключений, которые могут возникать в конечных точках GraphQL.
|
||||
|
||||
## Guards
|
||||
## Гарды
|
||||
|
||||
Смотрите [защиты](https://docs.nestjs.com/guards) для более подробной информации.
|
||||
|
||||
## Health
|
||||
## Работоспособность
|
||||
|
||||
Включает общедоступный REST API (healthz), который возвращает JSON, чтобы подтвердить, что база данных работает должным образом.
|
||||
|
||||
@@ -85,9 +85,9 @@ workspace
|
||||
|
||||
Корень каталога рабочей области включает `workspace.factory.ts`, файл, содержащий функцию `createGraphQLSchema`. Эта функция генерирует схему, специфичную для рабочей области, используя метаданные для адаптации схемы для индивидуальных рабочих областей. Разделением построения схемы и резолвера, мы используем функцию `makeExecutableSchema`, которая объединяет эти отдельные элементы.
|
||||
|
||||
This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
|
||||
Эта стратегия касается не только организации, но и помогает в оптимизации, например в кэшировании сгенерированных определений типов для повышения производительности и масштабируемости.
|
||||
|
||||
### Workspace Schema builder
|
||||
### Конструктор схем рабочей области
|
||||
|
||||
Генерирует GraphQL схему и включает:
|
||||
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ title: Очередь сообщений
|
||||
1. Добавьте имя очереди для вашей новой очереди в перечисление `MESSAGE_QUEUES`.
|
||||
2. Предоставьте фабричную реализацию очереди с именем очереди в качестве токена зависимости.
|
||||
3. Инжектируйте созданную вами очередь в необходимый модуль/сервис с именем очереди в качестве токена зависимости.
|
||||
4. Add worker class with token based injection just like producer.
|
||||
4. Добавьте класс worker с внедрением зависимостей на основе токена, как у producer.
|
||||
|
||||
### Пример использования
|
||||
|
||||
|
||||
+3
-3
@@ -5,12 +5,12 @@ title: Команды бекэнда
|
||||
## Полезные команды
|
||||
|
||||
Эти команды следует выполнять из папки packages/twenty-server.
|
||||
From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
|
||||
Из любой другой папки можно запускать `npx nx {command} twenty-server` (или `npx nx run twenty-server:{command}`).
|
||||
|
||||
### Первоначальная настройка
|
||||
|
||||
```
|
||||
npx nx database:reset twenty-server # setup the database with dev seeds
|
||||
npx nx database:reset twenty-server # настроить базу данных с начальными данными для разработки
|
||||
```
|
||||
|
||||
### Запуск сервера
|
||||
@@ -36,7 +36,7 @@ npx nx run twenty-server:test:integration # запуск интеграцион
|
||||
|
||||
### Сброс базы данных
|
||||
|
||||
If you want to reset and seed the database, you can run the following command:
|
||||
Если вы хотите сбросить и заполнить базу данных начальными данными, выполните следующую команду:
|
||||
|
||||
```bash
|
||||
npx nx run twenty-server:database:reset
|
||||
|
||||
+3
-3
@@ -6,7 +6,7 @@ title: Приложение Zapier
|
||||
|
||||
## О Zapier
|
||||
|
||||
Zapier — это инструмент, который позволяет автоматизировать рабочие процессы, соединяя приложения, которые ваша команда использует каждый день. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
|
||||
Zapier — это инструмент, который позволяет автоматизировать рабочие процессы, соединяя приложения, которые ваша команда использует каждый день. Основная концепция Zapier — это рабочие процессы автоматизации, называемые Zaps, которые включают триггеры и действия.
|
||||
|
||||
Вы можете узнать больше о том, как работает Zapier [здесь](https://zapier.com/how-it-works).
|
||||
|
||||
@@ -28,7 +28,7 @@ yarn
|
||||
zapier login
|
||||
```
|
||||
|
||||
### Step 3: Set environment variables
|
||||
### Шаг 3: Настройка переменных окружения
|
||||
|
||||
В каталоге `packages/twenty-zapier` выполните:
|
||||
|
||||
@@ -43,7 +43,7 @@ cp .env.example .env
|
||||
## Разработка
|
||||
|
||||
<Warning>
|
||||
Make sure to run `yarn build` before any `zapier` command.
|
||||
Перед выполнением любой команды `zapier` обязательно запустите `yarn build`.
|
||||
</Warning>
|
||||
|
||||
### Тест
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Bugs, Requests & Pull Requests
|
||||
info: Report issues, request features, and contribute code
|
||||
title: Ошибки, запросы и PR
|
||||
info: Сообщайте о проблемах, предлагайте новые функции и вносите вклад в код
|
||||
---
|
||||
|
||||
## Сообщение об ошибках
|
||||
@@ -13,66 +13,66 @@ info: Report issues, request features, and contribute code
|
||||
|
||||
Если вы не уверены, что это ошибка, и вам кажется, что это ближе к запросу на новую функцию, то вам, вероятно, стоит [начать обсуждение вместо этого](https://github.com/twentyhq/twenty/discussions/new).
|
||||
|
||||
## Submit a Pull Request
|
||||
## Отправьте PR
|
||||
|
||||
Contributing code to Twenty starts with a pull request (PR).
|
||||
Вклад в код Twenty начинается с PR.
|
||||
|
||||
### Перед началом
|
||||
|
||||
1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
|
||||
2. For new features, open an issue first to discuss
|
||||
3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
|
||||
1. Проверьте [существующие обращения](https://github.com/twentyhq/twenty/issues) на предмет связанной работы
|
||||
2. Для новых функций сначала откройте обращение для обсуждения
|
||||
3. Ознакомьтесь с нашим [Кодексом поведения](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
|
||||
|
||||
### Fork and Clone
|
||||
### Сделайте форк и клонируйте
|
||||
|
||||
1. Fork the repository on GitHub
|
||||
2. Clone your fork:
|
||||
1. Сделайте форк репозитория на GitHub
|
||||
2. Клонируйте свой форк:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/twenty.git
|
||||
cd twenty
|
||||
```
|
||||
|
||||
3. Add upstream remote:
|
||||
3. Добавьте удалённый репозиторий upstream:
|
||||
|
||||
```bash
|
||||
git remote add upstream https://github.com/twentyhq/twenty.git
|
||||
```
|
||||
|
||||
### Create a Branch
|
||||
### Создайте ветку
|
||||
|
||||
```bash
|
||||
git checkout -b feature/your-feature-name
|
||||
```
|
||||
|
||||
Use descriptive branch names:
|
||||
Используйте понятные названия веток:
|
||||
|
||||
* `feature/add-export-button`
|
||||
* `fix/login-redirect-issue`
|
||||
* `docs/update-api-guide`
|
||||
|
||||
### Make Your Changes
|
||||
### Внесите изменения
|
||||
|
||||
1. Write clean, well-documented code
|
||||
2. Follow existing code style
|
||||
3. Add tests for new functionality
|
||||
4. Update documentation if needed
|
||||
1. Пишите чистый, хорошо документированный код
|
||||
2. Соблюдайте существующий стиль кода
|
||||
3. Добавьте тесты для новой функциональности
|
||||
4. Обновите документацию при необходимости
|
||||
|
||||
### Submit Your PR
|
||||
### Отправьте свой PR
|
||||
|
||||
1. Push your branch:
|
||||
1. Отправьте свою ветку:
|
||||
|
||||
```bash
|
||||
git push origin feature/your-feature-name
|
||||
```
|
||||
|
||||
2. Open a PR on GitHub
|
||||
3. Fill in the PR template
|
||||
4. Link related issues
|
||||
2. Откройте PR на GitHub
|
||||
3. Заполните шаблон PR
|
||||
4. Привяжите связанные обращения
|
||||
|
||||
### PR Checklist
|
||||
### Чек-лист PR
|
||||
|
||||
* [ ] Code follows project style guidelines
|
||||
* [ ] Tests pass locally
|
||||
* [ ] Documentation is updated
|
||||
* [ ] PR description explains the changes
|
||||
* [ ] Код соответствует руководству по стилю проекта
|
||||
* [ ] Тесты проходят локально
|
||||
* [ ] Документация обновлена
|
||||
* [ ] Описание PR объясняет изменения
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ title: Архитектура папок
|
||||
info: Подробное рассмотрение нашей архитектуры папок
|
||||
---
|
||||
|
||||
In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
|
||||
В этом руководстве вы изучите детали структуры каталога проекта и то, как она способствует организации и сопровождаемости Twenty.
|
||||
|
||||
Следуя этому соглашению об архитектуре папок, легче находить файлы, связанные с конкретными функциями, и обеспечивать масштабируемость и поддерживаемость приложения.
|
||||
|
||||
|
||||
+13
-13
@@ -10,7 +10,7 @@ title: Руководство по стилю
|
||||
|
||||
Всегда держите в голове, что код читают чаще, чем пишут, особенно в проекте с открытым исходным кодом, где к нему может присоединиться кто угодно.
|
||||
|
||||
There are a lot of rules that are not defined here, but that are automatically checked by linters.
|
||||
Существует много правил, которые здесь не описаны, но автоматически проверяются линтерами.
|
||||
|
||||
## React
|
||||
|
||||
@@ -67,10 +67,10 @@ const EmailField: React.FC<{
|
||||
```
|
||||
|
||||
```tsx
|
||||
/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
|
||||
* component's props
|
||||
* - This method doesn't automatically include the children prop. If
|
||||
* you want to include it, you have to specify it in OwnProps.
|
||||
/* ✅ - Хорошо, отдельно определяется тип (OwnProps) для
|
||||
* пропсов компонента
|
||||
* - Этот метод не включает автоматически проп children. Если
|
||||
* вы хотите его включить, вам нужно указать его в OwnProps.
|
||||
*/
|
||||
type EmailFieldProps = {
|
||||
value: string;
|
||||
@@ -83,7 +83,7 @@ const EmailField = ({ value }: EmailFieldProps) => (
|
||||
|
||||
#### Нет разворачивания пропсов одиночной переменной в JSX-элементах.
|
||||
|
||||
Avoid using single variable prop spreading in JSX elements, like `{...props}`. Подобная практика часто приводит к менее читаемому и сложному в поддержке коду, так как непонятно, какие пропсы принимает компонент.
|
||||
Избегайте спреда пропсов из одной переменной в JSX-элементах, например `{...props}`. Подобная практика часто приводит к менее читаемому и сложному в поддержке коду, так как непонятно, какие пропсы принимает компонент.
|
||||
|
||||
```tsx
|
||||
/* ❌ - Bad, spreads a single variable prop into the underlying component
|
||||
@@ -94,8 +94,8 @@ const MyComponent = (props: OwnProps) => {
|
||||
```
|
||||
|
||||
```tsx
|
||||
/* ✅ - Good, Explicitly lists all props
|
||||
* - Enhances readability and maintainability
|
||||
/* ✅ - Хорошо, явно указывает все пропы
|
||||
* - Увеличивает читаемость и поддерживаемость
|
||||
*/
|
||||
const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
|
||||
return <OtherComponent {...{ prop1, prop2, prop3 }} />;
|
||||
@@ -123,10 +123,10 @@ const value = process.env.MY_VALUE ?? 'default';
|
||||
### Используйте опциональную цепочку `?.`
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
// ❌ Плохо
|
||||
onClick && onClick();
|
||||
|
||||
// ✅ Good
|
||||
// ✅ Хорошо
|
||||
onClick?.();
|
||||
```
|
||||
|
||||
@@ -279,12 +279,12 @@ import { Meta, StoryObj } from '@storybook/react';
|
||||
|
||||
* **Читаемость**: Избегающий импорт типов улучшает читаемость кода, делая ясным, когда вы импортируете значения или типы. Это снижает двусмысленность и облегчает понимание назначения импортируемых символов.
|
||||
|
||||
* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
|
||||
* **Поддерживаемость**: Это повышает поддерживаемость кодовой базы, поскольку разработчики могут идентифицировать и находить импорты только типов при просмотре или изменении кода.
|
||||
|
||||
### Правило ESLint
|
||||
|
||||
An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. Это правило создаст ошибки или предупреждения для всех нарушений импорта типов.
|
||||
Правило ESLint `@typescript-eslint/consistent-type-imports` обеспечивает соблюдение стандарта импортов без ключевого слова type. Это правило создаст ошибки или предупреждения для всех нарушений импорта типов.
|
||||
|
||||
Обратите внимание, что это правило касается редких крайних случаев, когда случаются непреднамеренные импорты типов. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). В большинстве случаев вам не нужно использовать импорты только типов.
|
||||
Обратите внимание, что это правило касается редких крайних случаев, когда случаются непреднамеренные импорты типов. Сам TypeScript не рекомендует эту практику, как указано в [примечаниях к выпуску TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). В большинстве случаев вам не нужно использовать импорты только типов.
|
||||
|
||||
Чтобы гарантировать соответствие вашего кода этому правилу, убедитесь, что вы запускаете ESLint как часть вашего рабочего процесса разработки.
|
||||
|
||||
@@ -250,7 +250,7 @@ Twenty требует кэша Redis для обеспечения наилуч
|
||||
|
||||
## Шаг 5: Настройка переменных окружения
|
||||
|
||||
Используйте переменные окружения или файлы `.env` для настройки вашего проекта. More info [here](/l/ru/developers/self-host/capabilities/setup)
|
||||
Используйте переменные окружения или файлы `.env` для настройки вашего проекта. Подробнее [здесь](/l/ru/developers/self-host/capabilities/setup)
|
||||
|
||||
Скопируйте `.env.example` файлы в `/front` и `/server`:
|
||||
|
||||
@@ -260,7 +260,7 @@ cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
|
||||
```
|
||||
|
||||
<Info>
|
||||
**Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/ru/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
|
||||
**Режим нескольких рабочих пространств:** По умолчанию Twenty работает в режиме одного рабочего пространства, где можно создать только одно рабочее пространство. Чтобы включить поддержку нескольких рабочих пространств (полезно для тестирования функций, основанных на поддоменах), установите `IS_MULTIWORKSPACE_ENABLED=true` в файле `.env` вашего сервера. См. [Режим нескольких рабочих пространств](/l/ru/developers/self-host/capabilities/setup#multi-workspace-mode) для подробностей.
|
||||
</Info>
|
||||
|
||||
## Шаг 6: Установка зависимостей
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Contribute
|
||||
description: Contribute to Twenty's open-source development.
|
||||
title: Внести вклад
|
||||
description: Внесите вклад в разработку Twenty с открытым исходным кодом.
|
||||
---
|
||||
|
||||
<Frame>
|
||||
@@ -9,24 +9,24 @@ description: Contribute to Twenty's open-source development.
|
||||
|
||||
## Обзор
|
||||
|
||||
Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
|
||||
Twenty — проект с открытым исходным кодом, который приветствует вклад сообщества. Независимо от того, исправляете ли вы ошибки, добавляете функции или улучшаете документацию, ваш вклад помогает сделать Twenty лучше для всех.
|
||||
|
||||
## Ways to Contribute
|
||||
## Способы внести вклад
|
||||
|
||||
* **Report bugs**: Help identify and document issues
|
||||
* **Submit features**: Propose and implement new functionality
|
||||
* **Improve documentation**: Make our docs clearer and more helpful
|
||||
* **Frontend development**: Work on the React-based UI
|
||||
* **Backend development**: Contribute to the NestJS server
|
||||
* **Сообщайте об ошибках**: помогайте выявлять и документировать проблемы
|
||||
* **Предлагайте функции**: предлагайте и реализуйте новую функциональность
|
||||
* **Улучшайте документацию**: сделайте нашу документацию понятнее и полезнее
|
||||
* **Фронтенд-разработка**: работайте над интерфейсом на базе React
|
||||
* **Бэкенд-разработка**: вносите вклад в сервер NestJS
|
||||
|
||||
## Getting Started
|
||||
## Начало работы
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Bug Reports & Requests" icon="bug" href="/l/ru/developers/contribute/capabilities/bug-and-requests">
|
||||
Report issues or request features
|
||||
<Card title="Отчеты об ошибках и запросы" icon="bug" href="/l/ru/developers/contribute/capabilities/bug-and-requests">
|
||||
Сообщайте о проблемах или запрашивайте новые функции
|
||||
</Card>
|
||||
|
||||
<Card title="Разработка интерфейса" icon="browser" href="/l/ru/developers/contribute/capabilities/frontend-development">
|
||||
Contribute to the UI
|
||||
Внесите вклад в пользовательский интерфейс
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -1,147 +1,147 @@
|
||||
---
|
||||
title: API
|
||||
description: Query and modify your CRM data programmatically using REST or GraphQL.
|
||||
description: Запрашивайте и изменяйте данные CRM программно с помощью REST или GraphQL.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
Twenty разработан для удобства разработчиков и предлагает мощные API, которые адаптируются к вашей пользовательской модели данных. Мы предоставляем четыре различных типа API, чтобы удовлетворить различные интеграционные потребности.
|
||||
|
||||
## Developer-First Approach
|
||||
## Подход, ориентированный на разработчиков
|
||||
|
||||
Twenty generates APIs specifically for your data model:
|
||||
Twenty генерирует API специально для вашей модели данных:
|
||||
|
||||
* **Длинные ID не требуются**: используйте названия объектов и полей прямо в конечных точках.
|
||||
* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
|
||||
* **Стандартные и пользовательские объекты обрабатываются одинаково**: ваши пользовательские объекты получают такой же доступ к API, как и встроенные.
|
||||
* **Выделенные конечные точки**: каждый объект и поле получают свою собственную конечную точку API.
|
||||
* **Пользовательская документация**: генерируется специально для модели данных вашего рабочего пространства.
|
||||
|
||||
<Note>
|
||||
Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
|
||||
Персонализированная документация по вашему API доступна в разделе **Настройки → API и вебхуки** после создания ключа API. Поскольку Twenty генерирует API, соответствующие вашей пользовательской модели данных, документация уникальна для вашего рабочего пространства.
|
||||
</Note>
|
||||
|
||||
## The Two API Types
|
||||
## Два типа API
|
||||
|
||||
### Основной API
|
||||
|
||||
Доступен на `/rest/` или `/graphql/`
|
||||
|
||||
Work with your actual **records** (the data):
|
||||
Работайте с реальными **записями** (данными):
|
||||
|
||||
* Create, read, update, delete People, Companies, Opportunities, etc.
|
||||
* Query and filter data
|
||||
* Создавайте, читайте, обновляйте и удаляйте People, Companies, Opportunities и т. д.
|
||||
* Запрашивайте и фильтруйте данные
|
||||
* Управление отношениями записей.
|
||||
|
||||
### API метаданных
|
||||
|
||||
Доступен на `/rest/metadata/` или `/metadata/`
|
||||
|
||||
Manage your **workspace and data model**:
|
||||
Управляйте своим **рабочим пространством и моделью данных**:
|
||||
|
||||
* Создание, изменение или удаление объектов и полей.
|
||||
* Настройка параметров рабочего пространства.
|
||||
* Define relationships between objects
|
||||
* Определяйте связи между объектами
|
||||
|
||||
## REST vs GraphQL
|
||||
## REST против GraphQL
|
||||
|
||||
Both Core and Metadata APIs are available in REST and GraphQL formats:
|
||||
И Core, и Metadata API доступны в форматах REST и GraphQL:
|
||||
|
||||
| Формат | Available Operations |
|
||||
| ----------- | ---------------------------------------------------------- |
|
||||
| **REST** | CRUD, batch operations, upserts |
|
||||
| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
|
||||
| Формат | Доступные операции |
|
||||
| ----------- | ------------------------------------------------------------------------ |
|
||||
| **REST** | CRUD, пакетные операции, upsert-операции |
|
||||
| **GraphQL** | То же самое + **пакетные upsert-операции**, запросы связей за один вызов |
|
||||
|
||||
Choose based on your needs — both formats access the same data.
|
||||
Выбирайте по своим потребностям — оба формата обращаются к одним и тем же данным.
|
||||
|
||||
## Конечные точки API
|
||||
|
||||
| Environment | Base URL |
|
||||
| --------------- | ------------------------- |
|
||||
| **Cloud** | `https://api.twenty.com/` |
|
||||
| **Self-Hosted** | `https://{your-domain}/` |
|
||||
| Среда | Базовый URL |
|
||||
| --------------------------- | ------------------------- |
|
||||
| **Облако** | `https://api.twenty.com/` |
|
||||
| **Самостоятельный хостинг** | `https://{your-domain}/` |
|
||||
|
||||
## Аутентификация
|
||||
|
||||
Every API request requires an API key in the header:
|
||||
Каждый запрос к API требует ключ API в заголовке:
|
||||
|
||||
```
|
||||
Authorization: Bearer YOUR_API_KEY
|
||||
```
|
||||
|
||||
### Create an API Key
|
||||
### Создать ключ API
|
||||
|
||||
1. Перейдите в **Настройки → API и Вебхуки**
|
||||
2. Click **+ Create key**
|
||||
2. Нажмите **+ Создать ключ**
|
||||
3. Настроить:
|
||||
* **Name**: Descriptive name for the key
|
||||
* **Expiration Date**: When the key expires
|
||||
* **Имя**: описательное название для ключа
|
||||
* **Дата истечения**: когда истекает срок действия ключа
|
||||
4. Нажмите **Сохранить**
|
||||
5. **Copy immediately** — the key is only shown once
|
||||
5. **Скопируйте сразу** — ключ показывается только один раз
|
||||
|
||||
<VimeoEmbed videoId="928786722" title="Creating API key" />
|
||||
<VimeoEmbed videoId="928786722" title="Создание ключа API" />
|
||||
|
||||
<Warning>
|
||||
Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
|
||||
Ваш ключ API предоставляет доступ к конфиденциальным данным. Не делитесь им с ненадежными сервисами. Если он скомпрометирован, немедленно отключите его и создайте новый.
|
||||
</Warning>
|
||||
|
||||
### Assign a Role to an API Key
|
||||
### Назначить роль ключу API
|
||||
|
||||
For better security, assign a specific role to limit access:
|
||||
Для повышения безопасности назначьте конкретную роль, чтобы ограничить доступ:
|
||||
|
||||
1. Перейдите в **Настройки → Роли**
|
||||
2. Click on the role to assign
|
||||
2. Нажмите на роль, которую хотите назначить
|
||||
3. Откройте вкладку **Назначение**
|
||||
4. Under **API Keys**, click **+ Assign to API key**
|
||||
5. Select the API key
|
||||
4. В разделе **Ключи API** нажмите **+ Назначить ключу API**
|
||||
5. Выберите ключ API
|
||||
|
||||
The key will inherit that role's permissions. See [Permissions](/l/ru/user-guide/permissions-access/capabilities/permissions) for details.
|
||||
Ключ унаследует разрешения этой роли. См. [Разрешения](/l/ru/user-guide/permissions-access/capabilities/permissions) для подробностей.
|
||||
|
||||
### Управление API-ключами
|
||||
|
||||
**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
|
||||
**Сгенерировать заново**: Настройки → API и вебхуки → Нажмите ключ → **Сгенерировать заново**
|
||||
|
||||
**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
|
||||
**Удалить**: Настройки → API и вебхуки → Нажмите ключ → **Удалить**
|
||||
|
||||
## API Playground
|
||||
## Песочница API
|
||||
|
||||
Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
|
||||
Тестируйте свои API прямо в браузере с нашей встроенной песочницей — доступной как для **REST**, так и для **GraphQL**.
|
||||
|
||||
### Access the Playground
|
||||
### Доступ к песочнице
|
||||
|
||||
1. Перейдите в **Настройки → API и Вебхуки**
|
||||
2. Create an API key (required)
|
||||
3. Click on **REST API** or **GraphQL API** to open the playground
|
||||
2. Создайте ключ API (обязательно)
|
||||
3. Нажмите на **REST API** или **GraphQL API**, чтобы открыть песочницу
|
||||
|
||||
### What You Get
|
||||
### Что вы получаете
|
||||
|
||||
* **Interactive documentation**: Generated for your specific data model
|
||||
* **Live testing**: Execute real API calls against your workspace
|
||||
* **Schema explorer**: Browse available objects, fields, and relationships
|
||||
* **Request builder**: Construct queries with autocomplete
|
||||
* **Интерактивная документация**: генерируется для вашей конкретной модели данных
|
||||
* **Тестирование в реальном времени**: выполняйте реальные вызовы API к вашему рабочему пространству
|
||||
* **Обозреватель схемы**: просматривайте доступные объекты, поля и связи
|
||||
* **Конструктор запросов**: создавайте запросы с автодополнением
|
||||
|
||||
The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
|
||||
Песочница отражает ваши пользовательские объекты и поля, поэтому документация всегда точна для вашего рабочего пространства.
|
||||
|
||||
## Пакетные операции
|
||||
|
||||
Both REST and GraphQL support batch operations:
|
||||
И REST, и GraphQL поддерживают пакетные операции:
|
||||
|
||||
* **Размер пакета**: до 60 записей на запрос.
|
||||
* **Operations**: Create, update, delete multiple records
|
||||
* **Операции**: создание, обновление, удаление нескольких записей
|
||||
|
||||
**GraphQL-only features:**
|
||||
**Функции только для GraphQL:**
|
||||
|
||||
* **Batch Upsert**: Create or update in one call
|
||||
* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
|
||||
* **Пакетный upsert**: создание или обновление за один вызов
|
||||
* Используйте имена объектов во множественном числе (например, `CreateCompanies` вместо `CreateCompany`)
|
||||
|
||||
## Rate Limits
|
||||
## Лимиты скорости
|
||||
|
||||
API requests are throttled to ensure platform stability:
|
||||
Запросы к API ограничиваются для обеспечения стабильности платформы:
|
||||
|
||||
| Лимит | Значение |
|
||||
| -------------- | -------------------- |
|
||||
| **Requests** | 100 calls per minute |
|
||||
| **Batch size** | 60 records per call |
|
||||
| Лимит | Значение |
|
||||
| ----------------- | ------------------------- |
|
||||
| **Запросы** | 100 запросов в минуту |
|
||||
| **Размер пакета** | 60 записей за один запрос |
|
||||
|
||||
<Tip>
|
||||
Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
|
||||
Используйте пакетные операции, чтобы максимизировать пропускную способность — обрабатывайте до 60 записей за один запрос API вместо выполнения отдельных запросов.
|
||||
</Tip>
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
---
|
||||
title: Twenty Apps
|
||||
description: Build and manage Twenty customizations as code.
|
||||
title: Приложения Twenty
|
||||
description: Создавайте и управляйте настройками Twenty в виде кода.
|
||||
---
|
||||
|
||||
<Warning>
|
||||
Apps are currently in alpha testing. The feature is functional but still evolving.
|
||||
Приложения сейчас проходят альфа-тестирование. Функциональность работает, но продолжает развиваться.
|
||||
</Warning>
|
||||
|
||||
## What Are Apps?
|
||||
## Что такое приложения?
|
||||
|
||||
Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
|
||||
Приложения позволяют создавать и управлять настройками Twenty **в виде кода**. Вместо настройки всего через интерфейс вы определяете модель данных и бессерверные функции в коде — так быстрее создавать, поддерживать и развёртывать в нескольких рабочих пространствах.
|
||||
|
||||
**What you can do today:**
|
||||
**Что вы можете делать уже сегодня:**
|
||||
|
||||
* Define custom objects and fields as code (managed data model)
|
||||
* Build serverless functions with custom triggers
|
||||
* Deploy the same app across multiple workspaces
|
||||
* Определяйте пользовательские объекты и поля в виде кода (управляемая модель данных)
|
||||
* Создавайте бессерверные функции с пользовательскими триггерами
|
||||
* Развёртывайте одно и то же приложение в нескольких рабочих пространствах
|
||||
|
||||
**Coming soon:**
|
||||
**Скоро:**
|
||||
|
||||
* Custom UI layouts and components
|
||||
* Пользовательские макеты и компоненты интерфейса
|
||||
|
||||
## Требования
|
||||
|
||||
* Node.js 24+ and Yarn 4
|
||||
* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
|
||||
* Node.js 24+ и Yarn 4
|
||||
* Рабочее пространство Twenty и ключ API (создайте его на https://app.twenty.com/settings/api-webhooks)
|
||||
|
||||
## Getting Started
|
||||
## Начало работы
|
||||
|
||||
Create a new app using the official scaffolder, then authenticate and start developing:
|
||||
Создайте новое приложение с помощью официального генератора, затем выполните аутентификацию и начните разработку:
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Scaffold a new app
|
||||
@@ -67,18 +67,18 @@ yarn app:uninstall
|
||||
yarn app:help
|
||||
```
|
||||
|
||||
See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
|
||||
Смотрите также: страницы справки CLI для [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) и [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
|
||||
|
||||
## Project structure (scaffolded)
|
||||
## Структура проекта (сгенерированного)
|
||||
|
||||
When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
|
||||
Когда вы запускаете `npx create-twenty-app@latest my-twenty-app`, генератор:
|
||||
|
||||
* Copies a minimal base application into `my-twenty-app/`
|
||||
* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
|
||||
* Creates config files and scripts wired to the `twenty` CLI
|
||||
* Generates a default application config and a default function role
|
||||
* Копирует минимальное базовое приложение в `my-twenty-app/`
|
||||
* Добавляет локальную зависимость `twenty-sdk` и конфигурацию Yarn 4
|
||||
* Создаёт файлы конфигурации и скрипты, подключённые к CLI `twenty`
|
||||
* Генерирует конфигурацию приложения по умолчанию и роль функции по умолчанию
|
||||
|
||||
A freshly scaffolded app looks like this:
|
||||
Свежесгенерированное приложение выглядит так:
|
||||
|
||||
```text filename="my-twenty-app/"
|
||||
my-twenty-app/
|
||||
@@ -102,21 +102,21 @@ my-twenty-app/
|
||||
utils/ # Optional - handler implementations & utilities
|
||||
```
|
||||
|
||||
### Convention-over-configuration
|
||||
### Соглашения важнее конфигурации
|
||||
|
||||
Applications use a **convention-over-configuration** approach where entities are detected by their file suffix. This allows flexible organization within the `src/app/` folder:
|
||||
Приложения используют подход **соглашения важнее конфигурации**, при котором сущности определяются по суффиксу файла. Это позволяет гибко организовать структуру в папке `src/app/`:
|
||||
|
||||
| File suffix | Entity type |
|
||||
| --------------- | ------------------------------- |
|
||||
| `*.object.ts` | Custom object definitions |
|
||||
| `*.function.ts` | Serverless function definitions |
|
||||
| `*.role.ts` | Role definitions |
|
||||
| Суффикс файла | Тип сущности |
|
||||
| --------------- | ------------------------------------- |
|
||||
| `*.object.ts` | Определения пользовательских объектов |
|
||||
| `*.function.ts` | Определения бессерверных функций |
|
||||
| `*.role.ts` | Определения ролей |
|
||||
|
||||
### Supported folder organizations
|
||||
### Поддерживаемые способы организации папок
|
||||
|
||||
You can organize your entities in any of these patterns:
|
||||
Вы можете организовать свои сущности по любому из этих шаблонов:
|
||||
|
||||
**Traditional (by type):**
|
||||
**Традиционный (по типам):**
|
||||
|
||||
```text
|
||||
src/app/
|
||||
@@ -129,7 +129,7 @@ src/app/
|
||||
└── admin.role.ts
|
||||
```
|
||||
|
||||
**Feature-based:**
|
||||
**По функциональности:**
|
||||
|
||||
```text
|
||||
src/app/
|
||||
@@ -140,7 +140,7 @@ src/app/
|
||||
└── postCardAdmin.role.ts
|
||||
```
|
||||
|
||||
**Flat:**
|
||||
**Плоский:**
|
||||
|
||||
```text
|
||||
src/app/
|
||||
@@ -150,66 +150,80 @@ src/app/
|
||||
└── admin.role.ts
|
||||
```
|
||||
|
||||
At a high level:
|
||||
В общих чертах:
|
||||
|
||||
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
|
||||
* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
|
||||
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
|
||||
* **.nvmrc**: Pins the Node.js version expected by the project.
|
||||
* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app's TypeScript sources.
|
||||
* **README.md**: A short README in the app root with basic instructions.
|
||||
* **src/app/**: The main place where you define your application-as-code:
|
||||
* `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See "Application config" below.
|
||||
* `*.role.ts`: Role definitions used by your serverless functions. See "Default function role" below.
|
||||
* `*.object.ts`: Custom object definitions.
|
||||
* `*.function.ts`: Serverless function definitions.
|
||||
* **src/utils/**: Optional folder for handler implementations and utilities.
|
||||
* **package.json**: Объявляет имя приложения, версию, движки (Node 24+, Yarn 4) и добавляет `twenty-sdk`, а также скрипты вроде `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` и `auth`, которые делегируют выполнение локальному CLI `twenty`.
|
||||
* **.gitignore**: Игнорирует распространённые артефакты, такие как `node_modules`, `.yarn`, `generated/` (типизированный клиент), `dist/`, `build/`, каталоги coverage, файлы журналов и файлы `.env*`.
|
||||
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Фиксируют и настраивают используемый в проекте инструментарий Yarn 4.
|
||||
* **.nvmrc**: Фиксирует версию Node.js, ожидаемую проектом.
|
||||
* **eslint.config.mjs** и **tsconfig.json**: Обеспечивают линтинг и конфигурацию TypeScript для исходников вашего приложения на TypeScript.
|
||||
* **README.md**: Короткий README в корне приложения с базовыми инструкциями.
|
||||
* **src/app/**: Основное место, где вы определяете приложение как код:
|
||||
* `application.config.ts`: Глобальная конфигурация вашего приложения (метаданные и параметры выполнения). См. раздел «Конфигурация приложения» ниже.
|
||||
* `*.role.ts`: Определения ролей, используемых вашими бессерверными функциями. См. раздел «Роль функции по умолчанию» ниже.
|
||||
* `*.object.ts`: Определения пользовательских объектов.
|
||||
* `*.function.ts`: Определения бессерверных функций.
|
||||
* **src/utils/**: Необязательная папка для реализаций обработчиков и утилит.
|
||||
|
||||
Later commands will add more files and folders:
|
||||
Позднее команды добавят больше файлов и папок:
|
||||
|
||||
* `yarn app:generate` will create a `generated/` folder (typed Twenty client + workspace types).
|
||||
* `yarn app:create-entity` will add entity definition files under `src/app/` for your custom objects, functions, or roles.
|
||||
* `yarn app:generate` создаст папку `generated/` (типизированный клиент Twenty + типы рабочего пространства).
|
||||
* `yarn app:create-entity` добавит файлы определений сущностей в `src/app/` для ваших пользовательских объектов, функций или ролей.
|
||||
l
|
||||
|
||||
## Аутентификация
|
||||
|
||||
The first time you run `yarn auth:login`, you'll be prompted for:
|
||||
При первом запуске `yarn auth:login` вам будет предложено указать:
|
||||
|
||||
* API URL (defaults to http://localhost:3000 or your current workspace profile)
|
||||
* API key
|
||||
* URL API (по умолчанию http://localhost:3000 или текущий профиль рабочего пространства)
|
||||
* Ключ API
|
||||
|
||||
Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace <name>`.
|
||||
Ваши учётные данные хранятся для каждого пользователя в `~/.twenty/config.json`. You can maintain multiple profiles and switch between them.
|
||||
|
||||
Примеры:
|
||||
### Managing workspaces
|
||||
|
||||
```bash filename="Terminal"
|
||||
# Login interactively (recommended)
|
||||
yarn auth:login
|
||||
|
||||
# Use a specific workspace profile
|
||||
# Login to a specific workspace profile
|
||||
yarn auth:login --workspace my-custom-workspace
|
||||
|
||||
# List all configured workspaces
|
||||
yarn auth:list
|
||||
|
||||
# Switch the default workspace (interactive)
|
||||
yarn auth:switch
|
||||
|
||||
# Switch to a specific workspace
|
||||
yarn auth:switch production
|
||||
|
||||
# Check current authentication status
|
||||
yarn auth:status
|
||||
```
|
||||
|
||||
## Use the SDK resources (types & config)
|
||||
Once you've switched workspaces with `auth:switch`, all subsequent commands will use that workspace by default. You can still override it temporarily with `--workspace <name>`.
|
||||
|
||||
The twenty-sdk provides typed building blocks and helper functions you use inside your app. Below are the key pieces you'll touch most often.
|
||||
## Используйте ресурсы SDK (типы и конфигурация)
|
||||
|
||||
### Helper functions
|
||||
Пакет twenty-sdk предоставляет типизированные строительные блоки и вспомогательные функции, которые вы используете внутри своего приложения. Ниже — ключевые части, с которыми вы будете работать чаще всего.
|
||||
|
||||
The SDK provides four helper functions with built-in validation for defining your app entities:
|
||||
### Вспомогательные функции
|
||||
|
||||
| Function | Назначение |
|
||||
| ------------------ | -------------------------------------------- |
|
||||
| `defineApp()` | Configure application metadata |
|
||||
| `defineObject()` | Define custom objects with fields |
|
||||
| `defineFunction()` | Define serverless functions with handlers |
|
||||
| `defineRole()` | Configure role permissions and object access |
|
||||
SDK предоставляет четыре вспомогательных функции с встроенной валидацией для определения сущностей вашего приложения:
|
||||
|
||||
These functions validate your configuration at runtime and provide better IDE autocompletion and type safety.
|
||||
| Функция | Назначение |
|
||||
| ------------------ | ----------------------------------------------- |
|
||||
| `defineApp()` | Настраивает метаданные приложения |
|
||||
| `defineObject()` | Определяет пользовательские объекты с полями |
|
||||
| `defineFunction()` | Определяет бессерверные функции с обработчиками |
|
||||
| `defineRole()` | Настраивает права роли и доступ к объектам |
|
||||
|
||||
### Defining objects
|
||||
Эти функции проверяют вашу конфигурацию во время выполнения и обеспечивают лучшую автодополняемость в IDE и безопасность типов.
|
||||
|
||||
Custom objects describe both schema and behavior for records in your workspace. Use `defineObject()` to define objects with built-in validation:
|
||||
### Определение объектов
|
||||
|
||||
Пользовательские объекты описывают как схему, так и поведение записей в вашем рабочем пространстве. Используйте `defineObject()` для определения объектов со встроенной валидацией:
|
||||
|
||||
```typescript
|
||||
// src/app/postCard.object.ts
|
||||
@@ -280,20 +294,20 @@ export default defineObject({
|
||||
});
|
||||
```
|
||||
|
||||
Key points:
|
||||
Основные моменты:
|
||||
|
||||
* Use `defineObject()` for built-in validation and better IDE support.
|
||||
* The `universalIdentifier` must be unique and stable across deployments.
|
||||
* Each field requires a `name`, `type`, `label`, and its own stable `universalIdentifier`.
|
||||
* The `fields` array is optional — you can define objects without custom fields.
|
||||
* You can scaffold new objects using `yarn app:create-entity`, which guides you through naming, fields, and relationships.
|
||||
* Используйте `defineObject()` для встроенной валидации и лучшей поддержки в IDE.
|
||||
* `universalIdentifier` должен быть уникальным и стабильным между развёртываниями.
|
||||
* Каждому полю требуются `name`, `type`, `label` и собственный стабильный `universalIdentifier`.
|
||||
* Массив `fields` необязателен — вы можете определять объекты без пользовательских полей.
|
||||
* Вы можете сгенерировать новые объекты с помощью `yarn app:create-entity`, который проведёт вас через выбор именования, полей и связей.
|
||||
|
||||
<Note>
|
||||
**Base fields are created automatically.** When you define a custom object, Twenty automatically adds standard fields such as `name`, `createdAt`, `updatedAt`, `createdBy`, `position`, and `deletedAt`. You don't need to define these in your `fields` array — only add your custom fields.
|
||||
**Базовые поля создаются автоматически.** Когда вы определяете пользовательский объект, Twenty автоматически добавляет стандартные поля, такие как `name`, `createdAt`, `updatedAt`, `createdBy`, `position` и `deletedAt`. Вам не нужно определять их в массиве `fields` — добавляйте только свои пользовательские поля.
|
||||
</Note>
|
||||
|
||||
<Accordion title="Alternative: Decorator-based syntax">
|
||||
You can also define objects using TypeScript decorators. This approach uses class-based syntax with `@Object`, `@Field`, and `@Relation` decorators:
|
||||
<Accordion title="Альтернатива: синтаксис на декораторах">
|
||||
Вы также можете определять объекты с помощью декораторов TypeScript. Этот подход использует классовый синтаксис с декораторами `@Object`, `@Field` и `@Relation`:
|
||||
|
||||
```typescript
|
||||
import {
|
||||
@@ -340,18 +354,18 @@ Key points:
|
||||
}
|
||||
```
|
||||
|
||||
Note: The decorator approach requires `experimentalDecorators` in your TypeScript config.
|
||||
Примечание: подход с декораторами требует `experimentalDecorators` в конфигурации TypeScript.
|
||||
</Accordion>
|
||||
|
||||
### Application config (application.config.ts)
|
||||
### Конфигурация приложения (application.config.ts)
|
||||
|
||||
Every app has a single `application.config.ts` file that describes:
|
||||
У каждого приложения есть единственный файл `application.config.ts`, который описывает:
|
||||
|
||||
* **Who the app is**: identifiers, display name, and description.
|
||||
* **How its functions run**: which role they use for permissions.
|
||||
* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
|
||||
* **Что это за приложение**: идентификаторы, отображаемое имя и описание.
|
||||
* **Как запускаются его функции**: какую роль они используют для прав доступа.
|
||||
* **(Необязательно) переменные**: пары ключ-значение, предоставляемые вашим функциям как переменные окружения.
|
||||
|
||||
Use `defineApp()` to define your application configuration:
|
||||
Используйте `defineApp()` для определения конфигурации вашего приложения:
|
||||
|
||||
```typescript
|
||||
// src/app/application.config.ts
|
||||
@@ -375,23 +389,23 @@ export default defineApp({
|
||||
});
|
||||
```
|
||||
|
||||
Notes:
|
||||
Заметки:
|
||||
|
||||
* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
|
||||
* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
|
||||
* `functionRoleUniversalIdentifier` must match the role you define in your `*.role.ts` file (see below).
|
||||
* `universalIdentifier` — это детерминированные идентификаторы, которыми вы управляете; сгенерируйте их один раз и сохраняйте стабильными между синхронизациями.
|
||||
* `applicationVariables` становятся переменными окружения для ваших функций (например, `DEFAULT_RECIPIENT_NAME` доступна как `process.env.DEFAULT_RECIPIENT_NAME`).
|
||||
* `functionRoleUniversalIdentifier` должен соответствовать роли, которую вы определяете в файле `*.role.ts` (см. ниже).
|
||||
|
||||
#### Roles and permissions
|
||||
#### Роли и разрешения
|
||||
|
||||
Applications can define roles that encapsulate permissions on your workspace's objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app's serverless functions.
|
||||
Приложения могут определять роли, инкапсулирующие права на объекты и действия в вашем рабочем пространстве. Поле `functionRoleUniversalIdentifier` в `application.config.ts` обозначает роль по умолчанию, используемую бессерверными функциями вашего приложения.
|
||||
|
||||
* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
|
||||
* The typed client will be restricted to the permissions granted to that role.
|
||||
* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
|
||||
* Ключ API во время выполнения, подставляемый как `TWENTY_API_KEY`, получается из этой роли функции по умолчанию.
|
||||
* Типизированный клиент будет ограничен правами, предоставленными этой ролью.
|
||||
* Следуйте принципу наименьших привилегий: создайте отдельную роль только с теми правами, которые нужны вашим функциям, и укажите её универсальный идентификатор.
|
||||
|
||||
##### Default function role (\*.role.ts)
|
||||
##### Роль функции по умолчанию (\*.role.ts)
|
||||
|
||||
When you scaffold a new app, the CLI also creates a default role file. Use `defineRole()` to define roles with built-in validation:
|
||||
Когда вы генерируете новое приложение, CLI также создаёт файл роли по умолчанию. Используйте `defineRole()` для определения ролей со встроенной валидацией:
|
||||
|
||||
```typescript
|
||||
// src/app/default-function.role.ts
|
||||
@@ -433,21 +447,21 @@ export default defineRole({
|
||||
});
|
||||
```
|
||||
|
||||
The `universalIdentifier` of this role is then referenced in `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
|
||||
`universalIdentifier` этой роли затем указывается в `application.config.ts` как `functionRoleUniversalIdentifier`. Иными словами:
|
||||
|
||||
* **\*.role.ts** defines what the default function role can do.
|
||||
* **application.config.ts** points to that role so your functions inherit its permissions.
|
||||
* **\*.role.ts** определяет, что может делать роль функции по умолчанию.
|
||||
* **application.config.ts** указывает на эту роль, чтобы ваши функции наследовали её права.
|
||||
|
||||
Notes:
|
||||
Заметки:
|
||||
|
||||
* Start from the scaffolded role, then progressively restrict it following least‑privilege.
|
||||
* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
|
||||
* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
|
||||
* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
|
||||
* Начните со сгенерированной роли, затем постепенно ограничивайте её, следуя принципу наименьших привилегий.
|
||||
* Замените `objectPermissions` и `fieldPermissions` на объекты/поля, которые нужны вашим функциям.
|
||||
* `permissionFlags` управляют доступом к возможностям на уровне платформы. Держите их минимальными; добавляйте только то, что нужно.
|
||||
* См. рабочий пример в приложении Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
|
||||
|
||||
### Serverless function config and entrypoint
|
||||
### Конфигурация бессерверной функции и точка входа
|
||||
|
||||
Each function file uses `defineFunction()` to export a configuration with a handler and optional triggers. Use the `*.function.ts` file suffix for automatic detection.
|
||||
Каждый файл функции использует `defineFunction()` для экспорта конфигурации с обработчиком и необязательными триггерами. Используйте суффикс файла `*.function.ts` для автоматического обнаружения.
|
||||
|
||||
```typescript
|
||||
// src/app/createPostCard.function.ts
|
||||
@@ -507,28 +521,28 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
Common trigger types:
|
||||
Распространённые типы триггеров:
|
||||
|
||||
* **route**: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
|
||||
* **route**: Публикует вашу функцию по HTTP-пути и методу **под конечной точкой `/s/`**:
|
||||
|
||||
> e.g. `path: '/post-card/create',` -> call on `<APP_URL>/s/post-card/create`
|
||||
> например, `path: '/post-card/create',` -> вызов по адресу `<APP_URL>/s/post-card/create`
|
||||
|
||||
* **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.
|
||||
* **cron**: Запускает вашу функцию по расписанию с использованием выражения CRON.
|
||||
* **databaseEvent**: Запускается при событиях жизненного цикла объектов рабочего пространства. Когда операция события — `updated`, можно указать конкретные поля для отслеживания в массиве `updatedFields`. Если оставить не заданным или пустым, любое обновление будет вызывать функцию.
|
||||
|
||||
> e.g. `person.updated`
|
||||
> например, `person.updated`
|
||||
|
||||
Notes:
|
||||
Заметки:
|
||||
|
||||
* The `triggers` array is optional. Functions without triggers can be used as utility functions called by other functions.
|
||||
* You can mix multiple trigger types in a single function.
|
||||
* Массив `triggers` необязателен. Функции без триггеров можно использовать как вспомогательные, вызываемые другими функциями.
|
||||
* Вы можете сочетать несколько типов триггеров в одной функции.
|
||||
|
||||
### Route trigger payload
|
||||
### Полезная нагрузка триггера маршрута
|
||||
|
||||
<Warning>
|
||||
**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object.
|
||||
**Нарушающее совместимость изменение (v1.16, январь 2026):** Формат полезной нагрузки триггера маршрута изменился. До v1.16 параметры запроса, параметры пути и тело передавались напрямую в качестве полезной нагрузки. Начиная с v1.16 они вложены в структурированный объект `RoutePayload`.
|
||||
|
||||
**Before v1.16:**
|
||||
**До v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (params) => {
|
||||
@@ -536,7 +550,7 @@ Notes:
|
||||
};
|
||||
```
|
||||
|
||||
**After v1.16:**
|
||||
**После v1.16:**
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -546,10 +560,10 @@ Notes:
|
||||
};
|
||||
```
|
||||
|
||||
**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object.
|
||||
**Чтобы мигрировать существующие функции:** Обновите обработчик, чтобы деструктурировать из `event.body`, `event.queryStringParameters` или `event.pathParameters` вместо прямого доступа к объекту params.
|
||||
</Warning>
|
||||
|
||||
When a route trigger invokes your function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`:
|
||||
Когда триггер маршрута вызывает вашу функцию, она получает объект `RoutePayload`, соответствующий формату AWS HTTP API v2. Импортируйте тип из `twenty-sdk`:
|
||||
|
||||
```typescript
|
||||
import { defineFunction, type RoutePayload } from 'twenty-sdk';
|
||||
@@ -565,21 +579,21 @@ const handler = async (event: RoutePayload) => {
|
||||
};
|
||||
```
|
||||
|
||||
The `RoutePayload` type has the following structure:
|
||||
Тип `RoutePayload` имеет следующую структуру:
|
||||
|
||||
| Property | Тип | Описание |
|
||||
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Query string parameters (multiple values joined with commas) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
|
||||
| `текст` | `object \| null` | Parsed request body (JSON) |
|
||||
| `isBase64Encoded` | `логический тип` | Whether the body is base64 encoded |
|
||||
| `requestContext.http.method` | `строка` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `строка` | Raw request path |
|
||||
| Свойство | Тип | Описание |
|
||||
| ---------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ |
|
||||
| `headers` | `Record<string, string \| undefined>` | HTTP-заголовки (только перечисленные в `forwardedRequestHeaders`) |
|
||||
| `queryStringParameters` | `Record<string, string \| undefined>` | Параметры строки запроса (несколько значений объединяются запятыми) |
|
||||
| `pathParameters` | `Record<string, string \| undefined>` | Параметры пути, извлечённые из шаблона маршрута (например, `/users/:id` → `{ id: '123' }`) |
|
||||
| `текст` | `object \| null` | Разобранное тело запроса (JSON) |
|
||||
| `isBase64Encoded` | `логический тип` | Является ли тело закодированным в base64 |
|
||||
| `requestContext.http.method` | `строка` | Метод HTTP (GET, POST, PUT, PATCH, DELETE) |
|
||||
| `requestContext.http.path` | `строка` | Необработанный путь запроса |
|
||||
|
||||
### Forwarding HTTP headers
|
||||
### Проброс HTTP-заголовков
|
||||
|
||||
By default, HTTP headers from incoming requests are **not** passed to your serverless function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array:
|
||||
По умолчанию HTTP-заголовки из входящих запросов **не** передаются в вашу бессерверную функцию по соображениям безопасности. Чтобы получить доступ к определённым заголовкам, явно перечислите их в массиве `forwardedRequestHeaders`:
|
||||
|
||||
```typescript
|
||||
export default defineFunction({
|
||||
@@ -599,7 +613,7 @@ export default defineFunction({
|
||||
});
|
||||
```
|
||||
|
||||
In your handler, you can then access these headers:
|
||||
В обработчике вы сможете получить доступ к этим заголовкам:
|
||||
|
||||
```typescript
|
||||
const handler = async (event: RoutePayload) => {
|
||||
@@ -612,17 +626,17 @@ const handler = async (event: RoutePayload) => {
|
||||
```
|
||||
|
||||
<Note>
|
||||
Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`).
|
||||
Имена заголовков приводятся к нижнему регистру. Обращайтесь к ним, используя ключи в нижнем регистре (например, `event.headers['content-type']`).
|
||||
</Note>
|
||||
|
||||
You can create new functions in two ways:
|
||||
Вы можете создать новые функции двумя способами:
|
||||
|
||||
* **Scaffolded**: Run `yarn app:create-entity` and choose the option to add a new function. This generates a starter file with a handler and config.
|
||||
* **Manual**: Create a new `*.function.ts` file and use `defineFunction()`, following the same pattern.
|
||||
* **Сгенерировано**: Запустите `yarn app:create-entity` и выберите опцию добавления новой функции. Это создаёт стартовый файл с обработчиком и конфигурацией.
|
||||
* **Вручную**: Создайте новый файл `*.function.ts` и используйте `defineFunction()`, следуя тому же шаблону.
|
||||
|
||||
### Generated typed client
|
||||
### Сгенерированный типизированный клиент
|
||||
|
||||
Run yarn app:generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
|
||||
Запустите yarn app:generate, чтобы создать локальный типизированный клиент в generated/ на основе схемы вашего рабочего пространства. Используйте его в своих функциях:
|
||||
|
||||
```typescript
|
||||
import Twenty from './generated';
|
||||
@@ -631,34 +645,34 @@ const client = new Twenty();
|
||||
const { me } = await client.query({ me: { id: true, displayName: true } });
|
||||
```
|
||||
|
||||
The client is re-generated by `yarn app:generate`. Re-run after changing your objects and `yarn app:sync` or when onboarding to a new workspace.
|
||||
Клиент повторно генерируется командой `yarn app:generate`. Запускайте повторно после изменения ваших объектов и `yarn app:sync` или при подключении к новому рабочему пространству.
|
||||
|
||||
#### Runtime credentials in serverless functions
|
||||
#### Учётные данные времени выполнения в бессерверных функциях
|
||||
|
||||
When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
|
||||
Когда ваша функция запускается на Twenty, платформа подставляет учётные данные как переменные окружения перед выполнением вашего кода:
|
||||
|
||||
* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
|
||||
* `TWENTY_API_KEY`: Short‑lived key scoped to your application's default function role.
|
||||
* `TWENTY_API_URL`: Базовый URL API Twenty, на который нацелено ваше приложение.
|
||||
* `TWENTY_API_KEY`: Краткоживущий ключ, ограниченный ролью функции по умолчанию вашего приложения.
|
||||
|
||||
Заметки:
|
||||
|
||||
* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
|
||||
* The API key's permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
|
||||
* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role's universal identifier.
|
||||
* Вам не нужно передавать URL или ключ API сгенерированному клиенту. Он читает `TWENTY_API_URL` и `TWENTY_API_KEY` из process.env во время выполнения.
|
||||
* Права ключа API определяются ролью, на которую ссылается ваш `application.config.ts` через `functionRoleUniversalIdentifier`. Это роль по умолчанию, используемая бессерверными функциями вашего приложения.
|
||||
* Приложения могут определять роли, чтобы следовать принципу наименьших привилегий. Выдавайте только те права, которые нужны вашим функциям, затем укажите в `functionRoleUniversalIdentifier` универсальный идентификатор этой роли.
|
||||
|
||||
### Hello World example
|
||||
### Пример Hello World
|
||||
|
||||
Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
|
||||
Посмотрите минимальный сквозной пример, демонстрирующий объекты, функции и несколько триггеров, [здесь](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
|
||||
|
||||
## Manual setup (without the scaffolder)
|
||||
## Ручная настройка (без генератора)
|
||||
|
||||
While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
|
||||
Хотя мы рекомендуем использовать `create-twenty-app` для наилучшего старта, вы также можете настроить проект вручную. Не устанавливайте CLI глобально. Вместо этого добавьте `twenty-sdk` как локальную зависимость и настройте скрипты в вашем package.json:
|
||||
|
||||
```bash filename="Terminal"
|
||||
yarn add -D twenty-sdk
|
||||
```
|
||||
|
||||
Then add scripts like these:
|
||||
Затем добавьте скрипты, подобные этим:
|
||||
|
||||
```json filename="package.json"
|
||||
{
|
||||
@@ -675,13 +689,13 @@ Then add scripts like these:
|
||||
}
|
||||
```
|
||||
|
||||
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:sync`, etc.
|
||||
Теперь вы можете запускать те же команды через Yarn, например, `yarn app:dev`, `yarn app:sync` и т. д.
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
* Authentication errors: run `yarn auth:login` and ensure your API key has the required permissions.
|
||||
* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
|
||||
* Types or client missing/outdated: run `yarn app:generate` and then `yarn app:dev`.
|
||||
* Dev mode not syncing: ensure `yarn app:dev` is running and that changes are not ignored by your environment.
|
||||
* Ошибки аутентификации: выполните `yarn auth:login` и убедитесь, что у вашего ключа API есть необходимые права.
|
||||
* Не удаётся подключиться к серверу: проверьте URL API и доступность сервера Twenty.
|
||||
* Отсутствующие/устаревшие типы или клиент: выполните `yarn app:generate`, затем `yarn app:dev`.
|
||||
* Режим разработки не синхронизируется: убедитесь, что запущен `yarn app:dev`, и что ваша среда не игнорирует изменения.
|
||||
|
||||
Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
Канал помощи в Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Extend
|
||||
description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
|
||||
title: Расширяйте
|
||||
description: Расширяйте возможности Twenty с помощью API, вебхуков и пользовательских приложений.
|
||||
---
|
||||
|
||||
<Frame>
|
||||
@@ -9,26 +9,26 @@ description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
|
||||
|
||||
## Обзор
|
||||
|
||||
Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
|
||||
Twenty разработан с учетом расширяемости. Используйте наши API, вебхуки и фреймворк приложений, чтобы интегрироваться с вашими существующими инструментами и создавать пользовательскую функциональность.
|
||||
|
||||
## What You Can Do
|
||||
## Что вы можете сделать
|
||||
|
||||
* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
|
||||
* **Webhooks**: Receive real-time notifications when events occur in Twenty
|
||||
* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
|
||||
* **APIs**: Запрашивайте и изменяйте данные CRM программно с помощью REST или GraphQL
|
||||
* **Вебхуки**: Получайте уведомления в реальном времени при возникновении событий в Twenty
|
||||
* **Приложения**: Создавайте пользовательские приложения, которые расширяют возможности Twenty - Скоро!
|
||||
|
||||
## Getting Started
|
||||
## Начало работы
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="API" icon="код" href="/l/ru/developers/extend/capabilities/apis">
|
||||
Connect to Twenty programmatically
|
||||
Подключайтесь к Twenty программно
|
||||
</Card>
|
||||
|
||||
<Card title="Вебхуки" icon="bell" href="/l/ru/developers/extend/capabilities/webhooks">
|
||||
Get notified of events in real-time
|
||||
Получайте уведомления о событиях в реальном времени
|
||||
</Card>
|
||||
|
||||
<Card title="Apps" icon="puzzle-piece" href="/l/ru/developers/extend/capabilities/apps">
|
||||
Build customizations as code (Alpha)
|
||||
<Card title="Приложения" icon="puzzle-piece" href="/l/ru/developers/extend/capabilities/apps">
|
||||
Создавайте настройки как код (Alpha)
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
---
|
||||
title: Getting Started
|
||||
description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
|
||||
title: Начало работы
|
||||
description: Добро пожаловать в документацию для разработчиков Twenty — ваш ресурс для расширения, самостоятельного развертывания и внесения вклада в Twenty.
|
||||
---
|
||||
|
||||
import { CardTitle } from "/snippets/card-title.mdx"
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card href="/l/ru/developers/extend/extend" img="/images/user-guide/integrations/plug.png">
|
||||
<CardTitle>Extend</CardTitle>
|
||||
Build integrations with APIs, webhooks, and custom apps.
|
||||
<CardTitle>Расширяйте</CardTitle>
|
||||
Создавайте интеграции с API, вебхуками и пользовательскими приложениями.
|
||||
</Card>
|
||||
|
||||
<Card href="/l/ru/developers/self-host/self-host" img="/images/user-guide/what-is-twenty/20.png">
|
||||
<CardTitle>Self-Host</CardTitle>
|
||||
Deploy and manage Twenty on your own infrastructure.
|
||||
<CardTitle>Развертывайте у себя</CardTitle>
|
||||
Развертывайте и управляйте Twenty в собственной инфраструктуре.
|
||||
</Card>
|
||||
|
||||
<Card href="/l/ru/developers/contribute/contribute" img="/images/user-guide/github/github-header.png">
|
||||
<CardTitle>Contribute</CardTitle>
|
||||
Join our open-source community and contribute to Twenty.
|
||||
<CardTitle>Вносите вклад</CardTitle>
|
||||
Присоединяйтесь к нашему сообществу с открытым исходным кодом и вносите вклад в Twenty.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -42,4 +42,4 @@ title: Другие методы
|
||||
|
||||
## Другое
|
||||
|
||||
Please feel free to Open a PR to add more Cloud Provider options.
|
||||
Пожалуйста, не стесняйтесь открыть PR, чтобы добавить больше вариантов облачных провайдеров.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
title: 1-Click w/ Docker Compose
|
||||
title: В один клик с Docker Compose
|
||||
---
|
||||
|
||||
<Warning>
|
||||
Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/ru/developers/contribute/capabilities/local-setup).
|
||||
Контейнеры Docker предназначены для продакшен-размещения или самостоятельного хостинга; для участия в разработке ознакомьтесь с разделом [Локальная установка](/l/ru/developers/contribute/capabilities/local-setup).
|
||||
</Warning>
|
||||
|
||||
## Обзор
|
||||
@@ -12,7 +12,7 @@ title: 1-Click w/ Docker Compose
|
||||
|
||||
**Важно:** изменяйте только те настройки, которые явно упоминаются в этом руководстве. Изменение других конфигураций может привести к проблемам.
|
||||
|
||||
See docs [Setup Environment Variables](/l/ru/developers/self-host/capabilities/setup) for advanced configuration. Все переменные окружения должны быть задекларированы в файле docker-compose.yml на уровне сервера и / или рабочего потока в зависимости от переменной.
|
||||
См. документацию [Настройка переменных окружения](/l/ru/developers/self-host/capabilities/setup) для расширенной конфигурации. Все переменные окружения должны быть задекларированы в файле docker-compose.yml на уровне сервера и / или рабочего потока в зависимости от переменной.
|
||||
|
||||
## Системные требования
|
||||
|
||||
@@ -96,7 +96,7 @@ docker compose up -d
|
||||
|
||||
Если вы размещаете twentyCRM на своем компьютере, откройте ваш браузер и перейдите на [http://localhost:3000](http://localhost:3000).
|
||||
|
||||
If you host it on a server, check that the server is running and that everything is ok with
|
||||
Если вы размещаете это на сервере, убедитесь, что сервер запущен и что все в порядке с
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000
|
||||
@@ -191,62 +191,62 @@ SSL (HTTPS) требуется для правильной работы неко
|
||||
|
||||
* **Последовательность:**
|
||||
|
||||
The `SERVER_URL` must match how users access your application in their browsers.
|
||||
Значение `SERVER_URL` должно соответствовать тому, как пользователи обращаются к вашему приложению в своих браузерах.
|
||||
|
||||
#### Сохранение данных
|
||||
|
||||
* **Data Volumes:**
|
||||
* **Тома данных:**
|
||||
|
||||
Конфигурация Docker Compose использует тома для сохранения данных базы данных и хранилища сервера.
|
||||
|
||||
* **Stateless Environments:**
|
||||
* **Среды без состояния:**
|
||||
|
||||
Если развёртывание осуществляется в бесстатном окружении (например, некоторых облачных сервисах), настройте внешнее хранилище для сохранения данных.
|
||||
|
||||
## Backup and Restore
|
||||
## Резервное копирование и восстановление
|
||||
|
||||
Regular backups protect your CRM data from loss.
|
||||
Регулярные резервные копии защищают данные вашей CRM от потери.
|
||||
|
||||
### Create a Database Backup
|
||||
### Создание резервной копии базы данных
|
||||
|
||||
```bash
|
||||
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### Automate Daily Backups
|
||||
### Автоматизируйте ежедневное резервное копирование
|
||||
|
||||
Add to your crontab (`crontab -e`):
|
||||
Добавьте в свой crontab (`crontab -e`):
|
||||
|
||||
```bash
|
||||
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
|
||||
```
|
||||
|
||||
### Restore from Backup
|
||||
### Восстановление из резервной копии
|
||||
|
||||
1. Stop the application:
|
||||
1. Остановите приложение:
|
||||
|
||||
```bash
|
||||
docker compose stop twenty-server twenty-front
|
||||
```
|
||||
|
||||
2. Restore the database:
|
||||
2. Восстановите базу данных:
|
||||
|
||||
```bash
|
||||
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
|
||||
```
|
||||
|
||||
3. Restart services:
|
||||
3. Перезапустите службы:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Backup Best Practices
|
||||
### Лучшие практики резервного копирования
|
||||
|
||||
* **Test restores regularly** — verify backups actually work
|
||||
* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
|
||||
* **Encrypt sensitive data** — protect backups with encryption
|
||||
* **Retain multiple copies** — keep daily, weekly, and monthly backups
|
||||
* **Регулярно проверяйте восстановление** — убедитесь, что резервные копии действительно работают
|
||||
* **Храните резервные копии вне площадки** — используйте облачное хранилище (S3, GCS и т. д.)
|
||||
* **Шифруйте конфиденциальные данные** — защищайте резервные копии с помощью шифрования
|
||||
* **Храните несколько копий** — сохраняйте ежедневные, еженедельные и ежемесячные резервные копии
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
|
||||
@@ -68,11 +68,11 @@ git config --global core.autocrlf false
|
||||
|
||||
В `packages/twenty-front/.env` раскомментируйте `VITE_DISABLE_TYPESCRIPT_CHECKER=true` и `VITE_DISABLE_ESLINT_CHECKER=true`, чтобы отключить фоновые проверки, таким образом уменьшая количество необходимой оперативной памяти.
|
||||
|
||||
**If it does not work:**
|
||||
Run only the services you need, instead of `npx nx start`. Например, если вы работаете на сервере, запускайте только `npx nx worker twenty-server`
|
||||
**Если это не работает:**
|
||||
Запускайте только те сервисы, которые вам нужны, вместо `npx nx start`. Например, если вы работаете на сервере, запускайте только `npx nx worker twenty-server`
|
||||
|
||||
**If it does not work:**
|
||||
If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
|
||||
**Если это не работает:**
|
||||
Если вы пытались запустить только `npx nx run twenty-server:start` в WSL и это завершается приведённой ниже ошибкой памяти:
|
||||
|
||||
`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
|
||||
|
||||
@@ -83,11 +83,11 @@ If you tried to run only `npx nx run twenty-server:start` on WSL and it's failin
|
||||
Флаг --max-old-space-size=8192 устанавливает верхний предел 8 ГБ для heap Node.js; использование этого значения зависит от потребностей приложения.
|
||||
Источник: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
|
||||
|
||||
**If it does not work:**
|
||||
Investigate which processes are taking you most of your machine RAM. В Twenty мы заметили, что некоторые расширения VScode потребляют много оперативной памяти, поэтому мы временно их отключаем.
|
||||
**Если это не работает:**
|
||||
Исследуйте, какие процессы занимают большую часть оперативной памяти вашей машины. В Twenty мы заметили, что некоторые расширения VScode потребляют много оперативной памяти, поэтому мы временно их отключаем.
|
||||
|
||||
**If it does not work:**
|
||||
Restart your machine helps to clean up ghost processes.
|
||||
**Если это не работает:**
|
||||
Перезагрузка вашей машины помогает очистить зависшие процессы.
|
||||
|
||||
#### При запуске `npx nx start` в логах появляются странные [0] и [1]
|
||||
|
||||
@@ -170,7 +170,7 @@ plugins: [
|
||||
|
||||
Выполните `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` в контейнере базы данных, чтобы получить доступ к административной панели.
|
||||
|
||||
### 1-click Docker compose
|
||||
### Docker Compose в один клик
|
||||
|
||||
#### Не удается войти в систему
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Self-Host
|
||||
description: Deploy and manage Twenty on your own infrastructure.
|
||||
title: Самостоятельный хостинг
|
||||
description: Развертывайте и управляйте Twenty в собственной инфраструктуре.
|
||||
---
|
||||
|
||||
<Frame>
|
||||
@@ -9,22 +9,22 @@ description: Deploy and manage Twenty on your own infrastructure.
|
||||
|
||||
## Обзор
|
||||
|
||||
Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
|
||||
Twenty можно развернуть в собственной инфраструктуре, что дает вам полный контроль над данными и процессом развертывания.
|
||||
|
||||
## Why Self-Host?
|
||||
## Почему самостоятельный хостинг?
|
||||
|
||||
* **Data ownership**: Keep all CRM data on your own servers
|
||||
* **Compliance**: Meet regulatory requirements for data residency
|
||||
* **Customization**: Full access to modify and extend the platform
|
||||
* **Владение данными**: Храните все данные CRM на собственных серверах
|
||||
* **Соответствие требованиям**: Соблюдайте регуляторные требования к локализации данных
|
||||
* **Настройка**: Полный доступ для изменения и расширения платформы
|
||||
|
||||
## Getting Started
|
||||
## Начало работы
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Docker Compose" icon="docker" href="/l/ru/developers/self-host/capabilities/docker-compose">
|
||||
Quick setup with Docker
|
||||
Быстрая настройка с Docker
|
||||
</Card>
|
||||
|
||||
<Card title="Cloud Providers" icon="cloud" href="/l/ru/developers/self-host/capabilities/cloud-providers">
|
||||
Deploy on AWS, GCP, or Azure
|
||||
<Card title="Облачные провайдеры" icon="cloud" href="/l/ru/developers/self-host/capabilities/cloud-providers">
|
||||
Разверните на AWS, GCP или Azure
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -18,7 +18,7 @@ image: /images/user-guide/github/github-header.png
|
||||
return (
|
||||
<Chip
|
||||
size="large"
|
||||
label="Clickable Chip"
|
||||
label="Кликабельный чип"
|
||||
clickable={true}
|
||||
variant="highlighted"
|
||||
accent="text-primary"
|
||||
@@ -39,7 +39,7 @@ image: /images/user-guide/github/github-header.png
|
||||
| linkToEntity | строка | Ссылка на объект |
|
||||
| entityId | строка | Уникальный идентификатор для объекта |
|
||||
| имя | строка | Имя объекта |
|
||||
| pictureUrl | строка | s picture", |
|
||||
| pictureUrl | строка | изображение", |
|
||||
| avatarType | Тип аватара | Тип аватара, который вы хотите отобразить. Есть два варианта: `округлый` и `квадратный` |
|
||||
| вариант | `EntityChipVariant` enum | Вариант элемента чипа, который вы хотите отобразить. Есть два варианта: `обычный` и `прозрачный` |
|
||||
| LeftIcon | ИконкаКомпонент | React-компонент, представляющий иконку. Отображается на левой стороне чипа |
|
||||
@@ -57,7 +57,7 @@ export const MyComponent = () => {
|
||||
return (
|
||||
<Chip
|
||||
size="large"
|
||||
label="Transparent Disabled Chip"
|
||||
label="Прозрачный неактивный чип"
|
||||
clickable={false}
|
||||
variant="rounded"
|
||||
accent="text-secondary"
|
||||
@@ -82,7 +82,7 @@ export const MyComponent = () => {
|
||||
return (
|
||||
<Chip
|
||||
size="large"
|
||||
label="Disabled chip that triggers a tooltip when overflowing."
|
||||
label="Неактивный чип, который показывает подсказку при переполнении."
|
||||
clickable={false}
|
||||
variant="regular"
|
||||
accent="text-primary"
|
||||
@@ -112,7 +112,7 @@ export const MyComponent = () => {
|
||||
<Chip
|
||||
linkToEntity="/entity-link"
|
||||
entityId="entityTest"
|
||||
name="Entity name"
|
||||
name="Название сущности"
|
||||
pictureUrl=""
|
||||
avatarType="rounded"
|
||||
variant="regular"
|
||||
@@ -130,7 +130,7 @@ export const MyComponent = () => {
|
||||
| linkToEntity | строка | Ссылка на объект |
|
||||
| entityId | строка | Уникальный идентификатор для объекта |
|
||||
| имя | строка | Имя объекта |
|
||||
| pictureUrl | строка | s picture", |
|
||||
| pictureUrl | строка | изображение", |
|
||||
| avatarType | Тип аватара | Тип аватара, который вы хотите отобразить. Есть два варианта: `округлый` и `квадратный` |
|
||||
| вариант | `EntityChipVariant` enum | Вариант элемента чипа, который вы хотите отобразить. Есть два варианта: `обычный` и `прозрачный` |
|
||||
| LeftIcon | ИконкаКомпонент | React-компонент, представляющий иконку. Отображается на левой стороне чипа |
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Soon Pill
|
||||
title: Плашка «Скоро»
|
||||
image: /images/user-guide/kanban-views/kanban.png
|
||||
---
|
||||
|
||||
|
||||
@@ -38,20 +38,20 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------ | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
||||
| className | строка | Дополнительное имя класса для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| полнаяШирина | логическое | Определяет, должна ли кнопка занимать всю ширину контейнера |
|
||||
| вариант | строка | Визуальный стиль кнопки. Включает опции `primary`, `secondary` и `tertiary` |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
|
||||
| акцент | строка | Акцентный цвет кнопки. Включает опции: `default`, `blue`, и `danger` |
|
||||
| скоро | булево | Указывает, отмечена ли кнопка как «скоро» (например, для предстоящих функций) |
|
||||
| отключено | булево | Определяет, отключена кнопка или нет |
|
||||
| фокус | булево | Определяет, имеет ли кнопка фокус |
|
||||
| onClick | функция | Функция обратного вызова, которая срабатывает при нажатии пользователем на кнопку |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------ | --------------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||
| className | строка | Дополнительное имя класса для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| полнаяШирина | логическое | Определяет, должна ли кнопка занимать всю ширину контейнера |
|
||||
| вариант | строка | Визуальный стиль кнопки. Включает опции `primary`, `secondary` и `tertiary` |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | Положение кнопки по отношению к соседним элементам. Опции включают: `standalone`, `left`, `right` и `middle` |
|
||||
| акцент | строка | Акцентный цвет кнопки. Включает опции: `default`, `blue`, и `danger` |
|
||||
| скоро | булево | Указывает, отмечена ли кнопка как «скоро» (например, для предстоящих функций) |
|
||||
| отключено | булево | Определяет, отключена кнопка или нет |
|
||||
| фокус | булево | Определяет, имеет ли кнопка фокус |
|
||||
| onClick | функция | Функция обратного вызова, которая срабатывает при нажатии пользователем на кнопку |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -116,13 +116,13 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| --------- | --------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| вариант | строка | The visual style variant of the buttons within the group. Включает опции `primary`, `secondary`, и `tertiary` |
|
||||
| размер | строка | Размер кнопок в группе. Has two options: `medium` and `small` |
|
||||
| акцент | строка | Акцентный цвет кнопок в группе. Включает опции `default`, `blue` и `danger` |
|
||||
| className | строка | Дополнительное имя класса для дополнительной стилизации |
|
||||
| children | ReactNode | Массив элементов React, представляющих отдельные кнопки в группе |
|
||||
| Свойства | Тип | Описание |
|
||||
| --------- | --------- | -------------------------------------------------------------------------------------------------- |
|
||||
| вариант | строка | Визуальный вариант оформления кнопок в группе. Включает опции `primary`, `secondary`, и `tertiary` |
|
||||
| размер | строка | Размер кнопок в группе. Имеет два варианта: `medium` и `small` |
|
||||
| акцент | строка | Акцентный цвет кнопок в группе. Включает опции `default`, `blue` и `danger` |
|
||||
| className | строка | Дополнительное имя класса для дополнительной стилизации |
|
||||
| children | ReactNode | Массив элементов React, представляющих отдельные кнопки в группе |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -153,17 +153,17 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------------ | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
|
||||
| применить тень | булево | Определяет, применять ли тень к кнопке |
|
||||
| применить размытие | булево | Определяет, применять ли размытие к кнопке |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------------ | --------------------- | ----------------------------------------------------------------------------------------------------------- |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | Положение кнопки по отношению к соседним элементам. Опции включают: `standalone`, `left`, `middle`, `right` |
|
||||
| применить тень | булево | Определяет, применять ли тень к кнопке |
|
||||
| применить размытие | булево | Определяет, применять ли размытие к кнопке |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -242,18 +242,18 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------------ | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
|
||||
| применить тень | булево | Определяет, применять ли тень к кнопке |
|
||||
| применить размытие | булево | Определяет, применять ли размытие к кнопке |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
| onClick | функция | Функция обратного вызова, которая срабатывает при нажатии пользователем на кнопку |
|
||||
| активен | булево | Определяет, находится ли кнопка в активном состоянии |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------------ | --------------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| позиция | строка | Положение кнопки по отношению к соседним элементам. Опции включают: `standalone`, `left`, `right` и `middle` |
|
||||
| применить тень | булево | Определяет, применять ли тень к кнопке |
|
||||
| применить размытие | булево | Определяет, применять ли размытие к кнопке |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
| onClick | функция | Функция обратного вызова, которая срабатывает при нажатии пользователем на кнопку |
|
||||
| активен | булево | Определяет, находится ли кнопка в активном состоянии |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -299,7 +299,7 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Light Button
|
||||
## Легкая кнопка
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Использование">
|
||||
@@ -327,7 +327,7 @@ image: /images/user-guide/views/filter.png
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| иконка | `React.ReactNode` | Иконка, которую вы хотите отобразить на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| акцент | строка | Акцентный цвет кнопки. Options include: `secondary` and `tertiary` |
|
||||
| акцент | строка | Акцентный цвет кнопки. Опции включают: `secondary` и `tertiary` |
|
||||
| активный | булево | Определяет, находится ли кнопка в активном состоянии |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
@@ -335,7 +335,7 @@ image: /images/user-guide/views/filter.png
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Light Icon Button
|
||||
## Легкая кнопка с иконкой
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Использование">
|
||||
@@ -370,7 +370,7 @@ image: /images/user-guide/views/filter.png
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| размер | строка | Размер кнопки. Есть два варианта: `small` и `medium` |
|
||||
| акцент | строка | Акцентный цвет кнопки. Options include: `secondary` and `tertiary` |
|
||||
| акцент | строка | Акцентный цвет кнопки. Опции включают: `secondary` и `tertiary` |
|
||||
| активный | булево | Определяет, находится ли кнопка в активном состоянии |
|
||||
| отключено | булево | Определяет, отключена ли кнопка |
|
||||
| фокус | булево | Указывает, имеет ли кнопка фокус |
|
||||
@@ -405,7 +405,7 @@ image: /images/user-guide/views/filter.png
|
||||
| -------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
|
||||
| заголовок | строка | Текстовое содержимое кнопки |
|
||||
| полнаяШирина | булево | Определяет, должна ли кнопка занимать всю ширину контейнера |
|
||||
| вариант | строка | Визуальный стиль кнопки. Options include `primary` and `secondary` |
|
||||
| вариант | строка | Визуальный стиль кнопки. Опции включают `primary` и `secondary` |
|
||||
| скоро | булево | Указывает, отмечена ли кнопка как «скоро» (например, для предстоящих функций) |
|
||||
| Иконка | `React.ComponentType` | Необязательный компонент иконки, отображаемый на кнопке |
|
||||
| React `button` props | `React.ComponentProps<'button'>` | Все стандартные свойства кнопки HTML поддерживаются |
|
||||
|
||||
@@ -31,14 +31,14 @@ image: /images/user-guide/tasks/tasks_header.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| --------------- | ------- | -------------------------------------------------------------------------------------------- |
|
||||
| checked | булево | Указывает, отмечен ли флажок |
|
||||
| indeterminate | булево | Указывает, находится ли флажок в неопределенном состоянии (ни отмечен, ни снят) |
|
||||
| onChange | функция | Функция обратного вызова, которую вы хотите вызвать при изменении состояния флажка |
|
||||
| onCheckedChange | функция | Функция обратного вызова, которую вы хотите вызвать при изменении состояния `отмечено` |
|
||||
| вариант | строка | The visual style variant of the box. Варианты включают: `primary`, `secondary`, и `tertiary` |
|
||||
| размер | строка | Размер флажка. Has two options: `small` and `large` |
|
||||
| форма | строка | Форма флажка. Имеет два варианта: `квадратная` и `округлая` |
|
||||
| Свойства | Тип | Описание |
|
||||
| --------------- | ------- | -------------------------------------------------------------------------------------- |
|
||||
| отмечено | булево | Указывает, отмечен ли флажок |
|
||||
| неопределенное | булево | Указывает, находится ли флажок в неопределенном состоянии (ни отмечен, ни снят) |
|
||||
| onChange | функция | Функция обратного вызова, которую вы хотите вызвать при изменении состояния флажка |
|
||||
| onCheckedChange | функция | Функция обратного вызова, которую вы хотите вызвать при изменении состояния `отмечено` |
|
||||
| вариант | строка | Визуальный стиль флажка. Варианты включают: `primary`, `secondary`, и `tertiary` |
|
||||
| размер | строка | Размер флажка. Есть два варианта: `small` и `large` |
|
||||
| форма | строка | Форма флажка. Имеет два варианта: `квадратная` и `округлая` |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -46,12 +46,12 @@ image: /images/user-guide/create-workspace/workspace-cover.png
|
||||
| --------------- | -------------------- | --------------------------------------------------------------------------------------- |
|
||||
| стиль | Свойства `React.CSS` | Дополнительные встроенные стили для компонента. |
|
||||
| className | строка | Необязательный CSS-класс для дополнительного стилирования |
|
||||
| checked | boolean | Indicates whether the radio button is checked |
|
||||
| отмечено | boolean | Указывает, отмечена ли радиокнопка |
|
||||
| значение | строка | Метка или текст, связанные с радио-кнопкой. |
|
||||
| onChange | функция | Функция вызывается при изменении выбранной радио-кнопки. |
|
||||
| onCheckedChange | функция | The function called when the `checked` state of the radio button changes |
|
||||
| размер | строка | Размер радио-кнопки. Options include: `large` and `small` |
|
||||
| отключено | boolean | If `true`, the radio button is disabled and not clickable |
|
||||
| onCheckedChange | функция | Функция, вызываемая при изменении состояния `checked` радиокнопки |
|
||||
| размер | строка | Размер радио-кнопки. Доступные варианты: `large` и `small` |
|
||||
| отключено | boolean | Если `true`, радиокнопка отключена и недоступна для нажатия |
|
||||
| позицияМетки | строка | Положение текста метки относительно радио-кнопки. Имеет два варианта: `left` и `right`. |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
@@ -87,11 +87,11 @@ image: /images/user-guide/create-workspace/workspace-cover.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------- | ----------------- | ---------------------------------------------------------------------------------- |
|
||||
| значение | строка | Значение в настоящее время выбранной радио-кнопки. |
|
||||
| onChange | функция | Функция обратного вызова, вызываемая при изменении радио-кнопки. |
|
||||
| onValueChange | функция | Функция обратного вызова, вызываемая при изменении выбранного значения в группе. |
|
||||
| children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------- | ----------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| значение | строка | Значение в настоящее время выбранной радио-кнопки. |
|
||||
| onChange | функция | Функция обратного вызова, вызываемая при изменении радио-кнопки. |
|
||||
| onValueChange | функция | Функция обратного вызова, вызываемая при изменении выбранного значения в группе. |
|
||||
| children | `React.ReactNode` | Позволяет передавать компоненты React (например, Radio) в качестве дочерних элементов для Radio Group |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -24,10 +24,10 @@ image: /images/user-guide/what-is-twenty/20.png
|
||||
<Select
|
||||
className
|
||||
disabled={false}
|
||||
label="Select an option"
|
||||
label="Выберите вариант"
|
||||
options={[
|
||||
{ value: 'option1', label: 'Option A', Icon: IconTwentyStar },
|
||||
{ value: 'option2', label: 'Option B', Icon: IconTwentyStar },
|
||||
{ value: 'option1', label: 'Вариант A', Icon: IconTwentyStar },
|
||||
{ value: 'option2', label: 'Вариант B', Icon: IconTwentyStar },
|
||||
]}
|
||||
value="option1"
|
||||
/>
|
||||
|
||||
@@ -9,22 +9,22 @@ import { CardTitle } from "/snippets/card-title.mdx"
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card href="/l/ru/twenty-ui/display" img="/images/user-guide/views/filter.png">
|
||||
<CardTitle>Display</CardTitle>
|
||||
Display components for showing information visually
|
||||
<CardTitle>Отображение</CardTitle>
|
||||
Компоненты отображения для визуального показа информации
|
||||
</Card>
|
||||
|
||||
<Card href="/l/ru/twenty-ui/progress-bar" img="/images/user-guide/fields/field.png">
|
||||
<CardTitle>Feedback</CardTitle>
|
||||
Feedback components for user notifications
|
||||
<CardTitle>Обратная связь</CardTitle>
|
||||
Компоненты обратной связи для уведомлений пользователей
|
||||
</Card>
|
||||
|
||||
<Card href="/l/ru/twenty-ui/input" img="/images/user-guide/tips/light-bulb.png">
|
||||
<CardTitle>Input</CardTitle>
|
||||
Input components for user interaction
|
||||
<CardTitle>Ввод</CardTitle>
|
||||
Компоненты ввода для взаимодействия с пользователем
|
||||
</Card>
|
||||
|
||||
<Card href="/l/ru/twenty-ui/navigation" img="/images/user-guide/tasks/tasks_header.png">
|
||||
<CardTitle>Navigation</CardTitle>
|
||||
Navigation components for user interface
|
||||
<CardTitle>Навигация</CardTitle>
|
||||
Компоненты навигации для пользовательского интерфейса
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -7,7 +7,7 @@ image: /images/user-guide/what-is-twenty/20.png
|
||||
<img src="/images/user-guide/what-is-twenty/20.png" alt="Заголовок" />
|
||||
</Frame>
|
||||
|
||||
## Contact Link
|
||||
## Ссылка Контакта
|
||||
|
||||
Стилизованный компонент ссылки для отображения контактной информации.
|
||||
|
||||
@@ -48,7 +48,7 @@ image: /images/user-guide/what-is-twenty/20.png
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Raw Link
|
||||
## Неоформленная ссылка
|
||||
|
||||
Стилизованный компонент для отображения ссылок.
|
||||
|
||||
@@ -85,7 +85,7 @@ image: /images/user-guide/what-is-twenty/20.png
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Rounded Link
|
||||
## Скруглённая ссылка
|
||||
|
||||
Округло-стилизованная ссылка с компонентом Chip для ссылок.
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ image: /images/user-guide/kanban-views/kanban.png
|
||||
| Свойства | Тип | Описание |
|
||||
| ----------------------- | ---------------- | ------------------------------------------------------------------------------------------ |
|
||||
| LeftIcon | Компонент иконки | Необязательная левая иконка, отображаемая перед текстом в пункте меню |
|
||||
| акцент | строка | Цвет акцента пункта меню. It can either be `default`, `placeholder`, and `danger` |
|
||||
| акцент | строка | Цвет акцента пункта меню. Это может быть `default`, `placeholder` или `danger`. |
|
||||
| кнопки с иконками | массив | Массив объектов, представляющих дополнительные кнопки с иконками, связанные с пунктом меню |
|
||||
| открытаПодсказка | булево | Управляет видимостью подсказки, связанной с пунктом меню |
|
||||
| нажатие | функция | Функция обратного вызова, выполняемая при клике по ссылке |
|
||||
@@ -287,19 +287,19 @@ image: /images/user-guide/kanban-views/kanban.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| --------- | ---------------- | --------------------------------------------------------------------- |
|
||||
| LeftIcon | Компонент иконки | Необязательная левая иконка, отображаемая перед текстом в пункте меню |
|
||||
| текст | строка | Текстовое содержание пункта меню |
|
||||
| выбрано | булево | Указывает, выбран ли пункт меню (отмечен) |
|
||||
| отключено | булево | Указывает, отключен ли пункт меню |
|
||||
| hovered | булево | Указывает, наводится ли указатель на пункт меню |
|
||||
| onClick | функция | Функция обратного вызова, вызываемая при нажатии на пункт меню |
|
||||
| className | строка | Необязательное имя для дополнительного стилирования |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------- | ---------------- | --------------------------------------------------------------------- |
|
||||
| LeftIcon | Компонент иконки | Необязательная левая иконка, отображаемая перед текстом в пункте меню |
|
||||
| текст | строка | Текстовое содержание пункта меню |
|
||||
| выбрано | булево | Указывает, выбран ли пункт меню (отмечен) |
|
||||
| отключено | булево | Указывает, отключен ли пункт меню |
|
||||
| при наведении | булево | Указывает, наводится ли указатель на пункт меню |
|
||||
| onClick | функция | Функция обратного вызова, вызываемая при нажатии на пункт меню |
|
||||
| className | строка | Необязательное имя для дополнительного стилирования |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Select Avatar
|
||||
### Выберите аватар
|
||||
|
||||
Выбираемый элемент меню с аватаром, с опциональным левым содержанием (аватар и текст) и индикатором (иконка "галочка") для отображения статуса выбора.
|
||||
|
||||
@@ -340,14 +340,14 @@ image: /images/user-guide/kanban-views/kanban.png
|
||||
| текст | строка | Текстовое содержание пункта меню |
|
||||
| выбрано | булево | Указывает, выбран ли пункт меню (отмечен) |
|
||||
| отключено | булево | Указывает, отключен ли пункт меню |
|
||||
| hovered | булево | Указывает, наводится ли указатель на пункт меню |
|
||||
| при наведении | булево | Указывает, наводится ли указатель на пункт меню |
|
||||
| идентификатор теста | строка | Атрибут data-testid для тестирования |
|
||||
| нажатие | функция | Функция обратного вызова, вызываемая при нажатии на пункт меню |
|
||||
| className | строка | Необязательное имя для дополнительного стилирования |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Select Color
|
||||
### Выберите цвет
|
||||
|
||||
Выбираемый элемент меню с образцом цвета, для ситуаций, когда пользователям нужно выбрать цвет из меню.
|
||||
|
||||
@@ -377,15 +377,15 @@ image: /images/user-guide/kanban-views/kanban.png
|
||||
</Tab>
|
||||
|
||||
<Tab title="Свойства">
|
||||
| Свойства | Тип | Описание |
|
||||
| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| цвет | строка | Цвет темы, который отображается как пример в пункте меню. Доступные варианты: `зелёный`, `бирюзовый`, `небесно-голубой`, `синий`, `фиолетовый`, `розовый`, `красный`, `оранжевый`, `жёлтый` и `серый`. |
|
||||
| выбран | булево | Указывает, выбран ли пункт меню (отмечен) |
|
||||
| отключен | булево | Указывает, отключен ли пункт меню |
|
||||
| hovered | булево | Указывает, наведено ли в данный момент на пункт меню |
|
||||
| вариант | строка | Вариант цветового образца. Это может быть либо `по умолчанию`, либо `конвейер`. |
|
||||
| onClick | функция | Функция обратного вызова, вызываемая при нажатии на пункт меню |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
| Свойства | Тип | Описание |
|
||||
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| цвет | строка | Цвет темы, который отображается как пример в пункте меню. Доступные варианты: `зелёный`, `бирюзовый`, `небесно-голубой`, `синий`, `фиолетовый`, `розовый`, `красный`, `оранжевый`, `жёлтый` и `серый`. |
|
||||
| выбран | булево | Указывает, выбран ли пункт меню (отмечен) |
|
||||
| отключен | булево | Указывает, отключен ли пункт меню |
|
||||
| при наведении | булево | Указывает, наведено ли в данный момент на пункт меню |
|
||||
| вариант | строка | Вариант цветового образца. Это может быть либо `по умолчанию`, либо `конвейер`. |
|
||||
| onClick | функция | Функция обратного вызова, вызываемая при нажатии на пункт меню |
|
||||
| className | строка | Необязательное имя для дополнительной стилизации |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -422,7 +422,7 @@ image: /images/user-guide/kanban-views/kanban.png
|
||||
| текст | строка | Текстовое содержание пункта меню |
|
||||
| переключено | булево | Указывает, в каком состоянии находится переключатель, "включено" или "выключено". |
|
||||
| onToggleChange | функция | Функция обратного вызова, вызываемая при изменении состояния переключателя |
|
||||
| размерПереключателя | строка | Размер переключателя. It can be either \ |
|
||||
| размерПереключателя | строка | Размер переключателя. Это может быть либо \ |
|
||||
| className | строка | Необязательное имя для дополнительного стилирования |
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
---
|
||||
title: AI Agents
|
||||
description: Integrate AI capabilities directly into your automation workflows.
|
||||
title: Агенты ИИ
|
||||
description: Интегрируйте возможности ИИ напрямую в рабочие процессы автоматизации.
|
||||
---
|
||||
|
||||
<Note>
|
||||
This feature is in development and will be available in beta soon.
|
||||
Эта функция находится в разработке и вскоре будет доступна в бета-версии.
|
||||
</Note>
|
||||
|
||||
## Обзор
|
||||
|
||||
Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
|
||||
Интегрируйте возможности ИИ напрямую в рабочие процессы автоматизации для интеллектуальной обработки данных и принятия решений.
|
||||
|
||||
## Capabilities
|
||||
## Возможности
|
||||
|
||||
| Feature | Описание |
|
||||
| ------------------- | ------------------------------------------------ |
|
||||
| **AI actions** | Add AI-powered steps to any workflow |
|
||||
| **Data enrichment** | Automatically enhance records with external data |
|
||||
| **Classification** | Categorize records based on content analysis |
|
||||
| **Summarization** | Generate summaries from text fields |
|
||||
| **Custom prompts** | Define exactly how AI processes your data |
|
||||
| Функция | Описание |
|
||||
| ---------------------------- | ---------------------------------------------------- |
|
||||
| **Действия ИИ** | Добавляйте шаги на базе ИИ в любой рабочий процесс |
|
||||
| **Обогащение данных** | Автоматически обогащайте записи внешними данными |
|
||||
| **Классификация** | Классифицируйте записи на основе анализа содержимого |
|
||||
| **Резюмирование** | Создавайте краткие сводки из текстовых полей |
|
||||
| **Пользовательские промпты** | Определяйте, как именно ИИ обрабатывает ваши данные |
|
||||
|
||||
## Use Cases
|
||||
## Сценарии использования
|
||||
|
||||
* **Lead scoring**: Automatically score and prioritize inbound leads
|
||||
* **Data cleanup**: Standardize company names and contact information
|
||||
* **Email drafts**: Generate follow-up emails based on meeting notes
|
||||
* **Record routing**: Assign records to the right team member based on content
|
||||
* **Оценка лидов**: Автоматически оценивайте и расставляйте приоритеты для входящих лидов
|
||||
* **Очистка данных**: Стандартизируйте названия компаний и контактную информацию
|
||||
* **Черновики писем**: Генерируйте черновики последующих писем на основе заметок встречи
|
||||
* **Маршрутизация записей**: Назначайте записи нужному участнику команды в зависимости от содержания
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Workflows Overview](/l/ru/user-guide/workflows/overview) — automation basics
|
||||
* [AI Permissions](/l/ru/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
|
||||
* [Обзор рабочих процессов](/l/ru/user-guide/workflows/overview) — основы автоматизации
|
||||
* [Разрешения ИИ](/l/ru/user-guide/ai/capabilities/permissions-access-control) — контроль доступа для агентов ИИ
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
---
|
||||
title: AI Chatbot
|
||||
description: An intelligent assistant that helps you interact with your CRM data using natural language.
|
||||
title: Чат-бот на базе ИИ
|
||||
description: Интеллектуальный помощник, который помогает взаимодействовать с данными вашей CRM на естественном языке.
|
||||
---
|
||||
|
||||
<Note>
|
||||
This feature is in development and will be available in beta soon.
|
||||
Эта функция находится в разработке и вскоре будет доступна в бета-версии.
|
||||
</Note>
|
||||
|
||||
## Обзор
|
||||
|
||||
An intelligent assistant that helps you interact with your CRM data using natural language.
|
||||
Интеллектуальный помощник, который помогает взаимодействовать с данными вашей CRM на естественном языке.
|
||||
|
||||
## Capabilities
|
||||
## Возможности
|
||||
|
||||
| Feature | Описание |
|
||||
| ---------------------------- | ------------------------------------------------------------------------- |
|
||||
| **Natural language queries** | Ask questions in plain English instead of building filters |
|
||||
| **Full data access** | Query records, relationships, and metrics across your workspace |
|
||||
| **Page context** | Reference "this company" or "this opportunity" based on your current view |
|
||||
| **Conversational** | Follow-up questions maintain context from previous queries |
|
||||
| Функция | Описание |
|
||||
| --------------------------------- | ------------------------------------------------------------------------------------------ |
|
||||
| **Запросы на естественном языке** | Задавайте вопросы на простом английском вместо создания фильтров |
|
||||
| **Полный доступ к данным** | Запрашивайте записи, связи и метрики во всём рабочем пространстве |
|
||||
| **Контекст страницы** | Ссылайтесь на "эту компанию" или "эту сделку" в зависимости от текущего контекста страницы |
|
||||
| **Диалоговый режим** | Последующие вопросы сохраняют контекст предыдущих запросов |
|
||||
|
||||
## Example Interactions
|
||||
## Примеры взаимодействий
|
||||
|
||||
### Finding Records
|
||||
### Поиск записей
|
||||
|
||||
* "Show me all opportunities over $50,000"
|
||||
* "Find contacts I haven't emailed in 2 weeks"
|
||||
* "List companies in the healthcare industry"
|
||||
* "Покажи все сделки свыше $50,000"
|
||||
* "Найди контакты, которым я не писал за последние 2 недели"
|
||||
* "Выведи список компаний в сфере здравоохранения"
|
||||
|
||||
### Getting Insights
|
||||
### Получение аналитики
|
||||
|
||||
* "What's my total pipeline value?"
|
||||
* "How many deals closed last month?"
|
||||
* "Which stage has the most stuck opportunities?"
|
||||
* "Какова общая стоимость моей воронки продаж?"
|
||||
* "Сколько сделок было закрыто в прошлом месяце?"
|
||||
* "На каком этапе больше всего застрявших сделок?"
|
||||
|
||||
### Using Page Context
|
||||
### Использование контекста страницы
|
||||
|
||||
* "Summarize my interactions with this person" (on a contact page)
|
||||
* "What opportunities are linked to this company?" (on a company page)
|
||||
* "When was this deal last updated?" (on an opportunity page)
|
||||
* "Подытожь мои взаимодействия с этим человеком" (на странице контакта)
|
||||
* "Какие сделки связаны с этой компанией?" (на странице компании)
|
||||
* "Когда эта сделка в последний раз была обновлена?" (на странице сделки)
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
---
|
||||
title: Billing FAQ
|
||||
description: Frequently asked questions about Twenty pricing and billing.
|
||||
title: FAQ по биллингу
|
||||
description: Часто задаваемые вопросы о тарифах и выставлении счетов в Twenty.
|
||||
---
|
||||
|
||||
## Цены
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Могу ли я использовать Twenty бесплатно, если я размещаю его сам?">
|
||||
Да, вы можете использовать Twenty бесплатно при самостоятельном размещении. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Поддержка доступна через наше сообщество Discord.
|
||||
Да, вы можете использовать Twenty бесплатно при самостоятельном размещении. Вы получите доступ ко всему, что включено в план Pro (облако), за исключением поддержки от нашей основной команды. Поддержка доступна через наше сообщество Discord.
|
||||
|
||||
If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
|
||||
Если вы хотите использовать самостоятельный хостинг и вам нужны Премиум-функции (SSO и разрешения на уровне записей), вы можете выбрать платную лицензию Organization (Self-Hosted). Это также включает поддержку от команды Twenty и снимает требование публиковать пользовательский код с открытым исходным кодом перед распространением.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What are the Premium features?">
|
||||
Premium features are only available on the Organization plans (Cloud or Self-Hosted):
|
||||
<Accordion title="Какие премиум‑функции доступны?">
|
||||
Премиум-функции доступны только в планах Organization (облако или Self-Hosted):
|
||||
|
||||
* **SSO integration**: Single Sign-On with your identity provider
|
||||
* **Row-level permissions**: Fine-grained access control at the record level
|
||||
* **Интеграция с SSO**: единый вход с вашим провайдером идентификации
|
||||
* **Разрешения на уровне записей**: детализированное управление доступом на уровне записей
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Предлагаете ли вы бесплатные места для пользователей с правами только просмотра?">
|
||||
@@ -31,36 +31,36 @@ description: Frequently asked questions about Twenty pricing and billing.
|
||||
Пожалуйста, свяжитесь с нашей командой напрямую через Поддержку, в данный момент нет простого способа сделать это через пользовательский интерфейс.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Where can I switch my subscription to Yearly?">
|
||||
Вы можете сделать это в разделе `Настройки → Оплата`. Then click on `Switch to Yearly`.
|
||||
<Accordion title="Где я могу переключить свою подписку на годовой период?">
|
||||
Вы можете сделать это в разделе `Настройки → Оплата`. Затем нажмите на `Switch to Yearly`.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Where can I switch my subscription to Monthly?">
|
||||
<Accordion title="Где я могу переключить свою подписку на ежемесячный период?">
|
||||
Пожалуйста, свяжитесь с нашей командой напрямую через Поддержку, в данный момент нет простого способа сделать это через пользовательский интерфейс.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Where can I see my credit usage?">
|
||||
<Accordion title="Где я могу посмотреть расход кредитов?">
|
||||
Вы найдете это в разделе `Настройки → Оплата`.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How many workflow credits do we have?">
|
||||
The number of credits depends on your billing cycle, not your plan:
|
||||
<Accordion title="Сколько у нас кредитов для рабочих процессов?">
|
||||
Кредиты привязаны к вашему платёжному циклу, а не к плану:
|
||||
|
||||
* **Monthly subscriptions**: 5 million credits per month
|
||||
* **Yearly subscriptions**: 50 million credits per year
|
||||
* **Ежемесячные подписки**: 5 миллионов кредитов в месяц
|
||||
* **Годовые подписки**: 50 миллионов кредитов в год
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How does workflow credit consumption work?">
|
||||
Each workflow action consumes credits based on its complexity:
|
||||
<Accordion title="Как работает расход кредитов для рабочих процессов?">
|
||||
Каждое действие рабочего процесса потребляет кредиты в зависимости от своей сложности:
|
||||
|
||||
* **Основные внутренние операции** (такие как поиск, обновление, создание записей) потребляют очень мало кредитов
|
||||
* **Более сложные операции**, такие как узлы кода и запросы к внешним службам, потребляют больше кредитов
|
||||
* **Запросы AI** (скоро будут) также будут потреблять больше кредитов в зависимости от использования
|
||||
|
||||
Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
|
||||
Кредиты списываются в режиме реального времени при выполнении рабочих процессов. Вы можете отслеживать использование в **Настройки → Биллинг**, чтобы контролировать расход и оставшиеся кредиты.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I buy more workflow credits?">
|
||||
<Accordion title="Могу ли я купить больше кредитов для рабочих процессов?">
|
||||
Вы можете купить дополнительные кредиты в разделе `Настройки → Оплата`.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
+28
-28
@@ -1,53 +1,53 @@
|
||||
---
|
||||
title: I Don't See Emails on Records
|
||||
description: Troubleshooting missing emails on records.
|
||||
title: Я не вижу электронных писем в записях
|
||||
description: Устранение неполадок с отсутствующими электронными письмами в записях.
|
||||
---
|
||||
|
||||
## Common Reasons
|
||||
## Распространённые причины
|
||||
|
||||
### 1. Initial Sync Still in Progress
|
||||
### 1. Первичная синхронизация всё ещё выполняется
|
||||
|
||||
Email sync takes time, especially for large mailboxes. Twenty imports emails at approximately **400 messages per minute** (limited by Gmail API rate limiting).
|
||||
Синхронизация почты занимает время, особенно для больших почтовых ящиков. Twenty импортирует письма примерно со скоростью **400 сообщений в минуту** (ограничено лимитами частоты Gmail API).
|
||||
|
||||
* **Calendar sync**: Completes in minutes
|
||||
* **Email sync**: Depends on mailbox size (e.g., 10,000 emails ≈ 25 minutes, 50,000 emails ≈ 2 hours)
|
||||
* **Синхронизация календаря**: завершается за несколько минут
|
||||
* **Синхронизация почты**: зависит от размера почтового ящика (например, 10,000 писем ≈ 25 минут, 50,000 писем ≈ 2 часа)
|
||||
|
||||
**Solution**: Wait for the initial import to complete. You can estimate timing based on your mailbox size.
|
||||
**Решение**: Дождитесь завершения первичного импорта. Вы можете оценить время в зависимости от размера вашего почтового ящика.
|
||||
|
||||
### 2. Contact Doesn't Exist in Twenty
|
||||
### 2. Контакт не существует в Twenty
|
||||
|
||||
Emails only appear on existing People records. If the contact wasn't created yet:
|
||||
Электронные письма отображаются только в существующих записях People. Если контакт ещё не создан:
|
||||
|
||||
* Enable **Contact Auto-Creation** in your mailbox settings
|
||||
* Or manually create the Person record first
|
||||
* Включите **Contact Auto-Creation** в настройках вашего почтового ящика
|
||||
* Или сначала вручную создайте запись Person
|
||||
|
||||
**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
|
||||
**Решение**: Перейдите в **Settings → Accounts**, выберите свой почтовый ящик и включите **Contact Auto-Creation**.
|
||||
|
||||
### 3. Internal Emails Are Excluded
|
||||
### 3. Внутренние электронные письма исключены
|
||||
|
||||
Emails between colleagues (same email domain) are never synced to maintain privacy.
|
||||
Электронные письма между коллегами (один и тот же домен электронной почты) никогда не синхронизируются для обеспечения конфиденциальности.
|
||||
|
||||
**Solution**: This is expected behavior. Only external emails are synced.
|
||||
**Решение**: Это ожидаемое поведение. Синхронизируются только внешние электронные письма.
|
||||
|
||||
### 4. Email Is from a Group or Distribution List
|
||||
### 4. Письмо от группы или списка рассылки
|
||||
|
||||
Group emails and distribution lists are excluded from sync.
|
||||
Групповые письма и списки рассылки исключены из синхронизации.
|
||||
|
||||
**Solution**: This is expected behavior.
|
||||
**Решение**: Это ожидаемое поведение.
|
||||
|
||||
### 5. Folder Not Selected for Sync
|
||||
### 5. Папка не выбрана для синхронизации
|
||||
|
||||
If you're using the Message Folder feature, some folders might be excluded.
|
||||
Если вы используете функцию Message Folder, некоторые папки могут быть исключены.
|
||||
|
||||
**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
|
||||
**Решение**: Перейдите в **Settings → Accounts**, выберите свой почтовый ящик и проверьте настройки синхронизации папок.
|
||||
|
||||
### 6. Wrong Email Address on Record
|
||||
### 6. Неверный адрес электронной почты в записи
|
||||
|
||||
The Person record might have a different email address than the one used in the email.
|
||||
В записи Person может быть указан другой адрес электронной почты, чем тот, который используется в письме.
|
||||
|
||||
**Solution**: Add the correct email address to the Person record.
|
||||
**Решение**: Добавьте корректный адрес электронной почты в запись Person.
|
||||
|
||||
## Still Not Working?
|
||||
## Всё ещё не работает?
|
||||
|
||||
1. Try disconnecting and reconnecting your mailbox
|
||||
2. Contact support if issues persist
|
||||
1. Попробуйте отключить и заново подключить ваш почтовый ящик
|
||||
2. Обратитесь в поддержку, если проблемы сохраняются
|
||||
|
||||
+41
-41
@@ -1,76 +1,76 @@
|
||||
---
|
||||
title: Error Handling & Validation
|
||||
description: Review and fix import errors directly in the UI before confirming.
|
||||
title: Обработка ошибок и проверка
|
||||
description: Просматривайте и исправляйте ошибки импорта прямо в интерфейсе перед подтверждением.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
## Pre-Import Validation
|
||||
## Предварительная проверка импорта
|
||||
|
||||
After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
|
||||
После загрузки файла и сопоставления полей Twenty проверяет ваши данные **перед** импортом. Это позволяет обнаруживать и исправлять ошибки, не затрагивая ваши существующие данные.
|
||||
|
||||
## Как это работает
|
||||
|
||||
1. **Upload** your CSV file
|
||||
2. **Map** your columns to Twenty fields
|
||||
3. **Review** the potential errors highlighted in yellow
|
||||
4. **Fix errors** directly in the UI
|
||||
5. **Confirm** the import
|
||||
1. **Загрузите** ваш CSV-файл
|
||||
2. **Сопоставьте** столбцы с полями Twenty
|
||||
3. **Просмотрите** потенциальные ошибки, выделенные желтым
|
||||
4. **Исправляйте ошибки** прямо в интерфейсе
|
||||
5. **Подтвердите** импорт
|
||||
|
||||
<VimeoEmbed videoId="1145273857" title="Видеодемонстрация" />
|
||||
|
||||
## Error Display
|
||||
## Отображение ошибок
|
||||
|
||||
Rows with issues are highlighted in **yellow**. You can:
|
||||
Строки с ошибками выделены **желтым**. Вы можете:
|
||||
|
||||
* **Edit the cell directly** to fix the error
|
||||
* **Remove the row** to skip it entirely
|
||||
* **Отредактируйте ячейку напрямую**, чтобы исправить ошибку
|
||||
* **Удалите строку**, чтобы пропустить её целиком
|
||||
|
||||
This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
|
||||
Такое встроенное редактирование экономит время — не нужно возвращаться к таблице, исправлять ошибки и загружать файл заново.
|
||||
|
||||
## Common Error Types
|
||||
## Распространённые типы ошибок
|
||||
|
||||
### Duplicate Values
|
||||
### Дублирующиеся значения
|
||||
|
||||
**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
|
||||
**Причина**: значение уникального поля (email, домен) уже есть в Twenty или встречается дважды в вашем файле.
|
||||
|
||||
**Fix**:
|
||||
**Решение**:
|
||||
|
||||
* Edit the duplicate value in the import UI
|
||||
* Remove one of the duplicate rows
|
||||
* Отредактируйте дублирующееся значение в интерфейсе импорта
|
||||
* Удалите одну из строк-дубликатов
|
||||
|
||||
See [Uniqueness Constraints](/l/ru/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
|
||||
См. [Ограничения уникальности](/l/ru/user-guide/data-migration/capabilities/uniqueness-constraints) для подробностей о том, как обеспечивается уникальность.
|
||||
|
||||
### Invalid Format
|
||||
### Недопустимый формат
|
||||
|
||||
**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
|
||||
**Причина**: данные не соответствуют ожидаемому формату (например, некорректный email, неверный формат даты).
|
||||
|
||||
**Fix**: Edit the cell to use the correct format.
|
||||
**Решение**: отредактируйте ячейку, указав правильный формат.
|
||||
|
||||
See [Field Mapping](/l/ru/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
|
||||
См. [Сопоставление полей](/l/ru/user-guide/data-migration/capabilities/field-mapping), чтобы узнать ожидаемый формат для каждого типа поля.
|
||||
|
||||
### Missing Required Fields
|
||||
### Отсутствуют обязательные поля
|
||||
|
||||
**Cause**: A required field is empty.
|
||||
**Причина**: обязательное поле пусто.
|
||||
|
||||
**Fix**: Enter a value in the required field or remove the row.
|
||||
**Решение**: введите значение в обязательное поле или удалите строку.
|
||||
|
||||
### Relation Not Found
|
||||
### Связь не найдена
|
||||
|
||||
**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
|
||||
**Причина**: ссылочная запись не существует (например, домен компании, который не был импортирован).
|
||||
|
||||
**Fix**:
|
||||
**Решение**:
|
||||
|
||||
* Import the parent records first
|
||||
* Or correct the reference value
|
||||
* Сначала импортируйте родительские записи
|
||||
* Или исправьте ссылочное значение
|
||||
|
||||
See [Import Relations](/l/ru/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
|
||||
См. [Импорт связей](/l/ru/user-guide/data-migration/capabilities/import-relations) для правильного порядка импорта и способов связывания записей.
|
||||
|
||||
## Tips for Fewer Errors
|
||||
## Советы для уменьшения количества ошибок
|
||||
|
||||
1. **Download the template** to see expected format prior to importing your file
|
||||
2. **Clean your data** in the spreadsheet first
|
||||
3. **Import files in correct order** to import relations (Companies → People → Opportunities)
|
||||
4. **Test with small batches** before full import
|
||||
5. **Check for duplicates** before uploading
|
||||
6. **Limit the size of your file to 10,000 records** per file
|
||||
1. **Скачайте шаблон**, чтобы увидеть ожидаемый формат перед импортом файла
|
||||
2. **Очистите данные** сначала в таблице
|
||||
3. **Импортируйте файлы в правильном порядке**, чтобы импортировать связи (Компании → Контакты → Сделки)
|
||||
4. **Протестируйте на небольших партиях** перед полным импортом
|
||||
5. **Проверьте наличие дублей** перед загрузкой
|
||||
6. **Ограничьте размер каждого файла 10 000 записями**
|
||||
|
||||
+38
-38
@@ -1,72 +1,72 @@
|
||||
---
|
||||
title: Uniqueness Constraints
|
||||
description: How Twenty enforces data uniqueness during import.
|
||||
title: Ограничения уникальности
|
||||
description: Как Twenty обеспечивает уникальность данных при импорте.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
## Обзор
|
||||
|
||||
Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
|
||||
Twenty обеспечивает уникальность для определённых полей, чтобы предотвратить дублирование записей и обеспечить целостность данных. Понимание этих ограничений важно для успешного импорта.
|
||||
|
||||
## Default Unique Fields
|
||||
## Уникальные поля по умолчанию
|
||||
|
||||
| Объект | Unique Fields |
|
||||
| ---------------------------- | ---------------------- |
|
||||
| **People** | `id`, `email` |
|
||||
| **Компании** | `id`, `domain` |
|
||||
| **Пользовательские объекты** | `id` only (by default) |
|
||||
| Объект | Уникальные поля |
|
||||
| ---------------------------- | -------------------------- |
|
||||
| **Люди** | `id`, `email` |
|
||||
| **Компании** | `id`, `domain` |
|
||||
| **Пользовательские объекты** | Только `id` (по умолчанию) |
|
||||
|
||||
<Note>The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).</Note>
|
||||
<Note>Поле `id` — внутренний идентификатор Twenty, автоматически создаётся для каждой записи. Используется формат UUID (например, `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).</Note>
|
||||
|
||||
## Custom Unique Fields
|
||||
## Пользовательские уникальные поля
|
||||
|
||||
You can define additional unique fields under **Settings → Data Model**:
|
||||
Вы можете задать дополнительные уникальные поля в разделе **Настройки → Модель данных**:
|
||||
|
||||
1. Go to **Settings → Data Model**
|
||||
2. Select the object
|
||||
3. Click on a field
|
||||
4. Enable **Unique** in field settings
|
||||
1. Перейдите в **Настройки → Модель данных**
|
||||
2. Выберите объект
|
||||
3. Нажмите на поле
|
||||
4. Включите **Уникальность** в настройках поля
|
||||
|
||||
### Use Cases for Custom Unique Fields
|
||||
### Сценарии использования пользовательских уникальных полей
|
||||
|
||||
* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
|
||||
* **Business identifiers**: Employee numbers, customer codes
|
||||
* **Alternative contact info**: LinkedIn profile, phone number
|
||||
* **Внешние идентификаторы**: храните идентификаторы из других систем (Salesforce ID, HubSpot ID)
|
||||
* **Бизнес-идентификаторы**: номера сотрудников, коды клиентов
|
||||
* **Альтернативные контактные данные**: профиль LinkedIn, номер телефона
|
||||
|
||||
<Note>The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.</Note>
|
||||
<Note>Имя поля `id` зарезервировано для внутреннего идентификатора Twenty. Для внешних идентификаторов используйте другое имя, например `externalId` или `legacyId`.</Note>
|
||||
|
||||
## Import Behavior
|
||||
## Поведение при импорте
|
||||
|
||||
### Creating New Records
|
||||
### Создание новых записей
|
||||
|
||||
If a unique field value doesn't exist, a new record is created.
|
||||
Если значение уникального поля отсутствует, создаётся новая запись.
|
||||
|
||||
### Updating Existing Records
|
||||
### Обновление существующих записей
|
||||
|
||||
If a unique field value matches an existing record, that record is **updated** with the new data.
|
||||
<Warning>To **update existing records**, it is recommended to **only match one unique field**.</Warning>
|
||||
Если значение уникального поля совпадает с существующей записью, эта запись будет **обновлена** новыми данными.
|
||||
<Warning>Чтобы **обновлять существующие записи**, рекомендуется **сопоставлять только одно уникальное поле**.</Warning>
|
||||
|
||||
### Soft-Deleted Records
|
||||
### Записи, помеченные как удалённые
|
||||
|
||||
<Warning>
|
||||
**Deleted records count toward uniqueness.**
|
||||
**Записи, помеченные как удалённые, учитываются при проверке уникальности.**
|
||||
|
||||
Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
|
||||
Записи, помеченные как удалённые (видны в Командном меню → Показать удалённые записи), учитываются при проверке уникальности. Если вы импортируете запись с тем же уникальным значением, что и у удалённой записи, удалённая запись будет **восстановлена** с новыми данными.
|
||||
</Warning>
|
||||
|
||||
## Duplicate Detection During Import
|
||||
## Обнаружение дубликатов при импорте
|
||||
|
||||
During the validation phase:
|
||||
На этапе проверки:
|
||||
|
||||
* Duplicates within your file are highlighted in yellow
|
||||
* You can edit or remove duplicate rows from the UI before starting the import
|
||||
* Дубликаты в вашем файле подсвечиваются жёлтым
|
||||
* Вы можете отредактировать или удалить строки-дубликаты в интерфейсе перед началом импорта
|
||||
|
||||
<VimeoEmbed videoId="1145246326" title="Видеодемонстрация" />
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
1. **Remove duplicates** from your file before importing
|
||||
2. **Check for existing records** in Twenty before importing
|
||||
3. **Use external IDs** when migrating from other systems
|
||||
4. **Include unique fields** if you want to update existing records
|
||||
1. **Удалите дубликаты** из файла перед импортом
|
||||
2. **Проверьте наличие существующих записей** в Twenty перед импортом
|
||||
3. **Используйте внешние идентификаторы** при миграции из других систем
|
||||
4. **Указывайте уникальные поля**, если хотите обновлять существующие записи
|
||||
|
||||
+104
-104
@@ -1,176 +1,176 @@
|
||||
---
|
||||
title: Import Data via API
|
||||
description: When and how to use Twenty's APIs for large-scale data imports.
|
||||
title: Импорт данных через API
|
||||
description: Когда и как использовать API Twenty для массового импорта данных.
|
||||
---
|
||||
|
||||
## Обзор
|
||||
|
||||
Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
|
||||
Twenty предоставляет как **GraphQL**, так и **REST API** для программного импорта данных. Используйте API, когда импорт CSV непрактичен для вашего объёма данных или когда вам нужен автоматизированный регулярный импорт.
|
||||
|
||||
## When to Use API Import
|
||||
## Когда использовать импорт через API
|
||||
|
||||
| Scenario | Recommended Method |
|
||||
| ---------------------------------- | ----------------------------- |
|
||||
| Under 10,000 records | CSV Import |
|
||||
| 10,000 - 50,000 records | CSV Import (split into files) |
|
||||
| **50,000+ records** | **API Import** |
|
||||
| One-time migration | Either (based on volume) |
|
||||
| **Recurring imports** | **API Import** |
|
||||
| **Real-time sync** | **API Import** |
|
||||
| **Integration with other systems** | **API Import** |
|
||||
| Сценарий | Рекомендуемый метод |
|
||||
| ------------------------------------ | -------------------------------------------- |
|
||||
| Менее 10,000 записей | Импорт CSV |
|
||||
| 10,000 - 50,000 записей | Импорт CSV (разбить на файлы) |
|
||||
| **50,000+ записей** | **Импорт через API** |
|
||||
| Однократная миграция | Любой из вариантов (в зависимости от объёма) |
|
||||
| **Регулярный импорт** | **Импорт через API** |
|
||||
| **Синхронизация в реальном времени** | **Импорт через API** |
|
||||
| **Интеграция с другими системами** | **Импорт через API** |
|
||||
|
||||
<Note>For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.</Note>
|
||||
<Note>Для наборов данных в сотни тысяч записей API значительно быстрее и надёжнее, чем многократный импорт CSV.</Note>
|
||||
|
||||
## API Rate Limits
|
||||
## Лимиты скорости API
|
||||
|
||||
Twenty enforces rate limits to ensure system stability:
|
||||
Twenty применяет лимиты скорости для обеспечения стабильности системы:
|
||||
|
||||
| Лимит | Значение |
|
||||
| -------------------------- | --------------------- |
|
||||
| **Requests per minute** | 100 |
|
||||
| **Records per batch call** | 60 |
|
||||
| **Maximum throughput** | ~6,000 records/minute |
|
||||
| Лимит | Значение |
|
||||
| --------------------------------------- | ------------------ |
|
||||
| **Запросов в минуту** | 100 |
|
||||
| **Записей на один пакетный вызов** | 60 |
|
||||
| **Максимальная пропускная способность** | ~6,000 записей/мин |
|
||||
|
||||
<Warning>
|
||||
**Plan your import around these limits.**
|
||||
**Планируйте импорт с учётом этих ограничений.**
|
||||
|
||||
For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
|
||||
Для 100,000 записей при максимальной пропускной способности ожидайте примерно 17 минут на импорт. Добавьте запас времени на обработку ошибок и повторные попытки.
|
||||
</Warning>
|
||||
|
||||
## Getting Started
|
||||
## Начало работы
|
||||
|
||||
### Step 1: Get Your API Key
|
||||
### Шаг 1: Получите свой API-ключ
|
||||
|
||||
1. Go to **Settings → Developers**
|
||||
2. Click **+ Create API key**
|
||||
3. Give your key a descriptive name
|
||||
4. Copy the API key immediately (it won't be shown again)
|
||||
5. Store it securely
|
||||
1. Перейдите в **Настройки → Разработчики**
|
||||
2. Нажмите **+ Создать API-ключ**
|
||||
3. Дайте вашему ключу информативное имя
|
||||
4. Сразу скопируйте API-ключ (он больше не будет показан)
|
||||
5. Храните его в защищённом месте
|
||||
|
||||
<Warning>
|
||||
**Keep your API key secret.**
|
||||
**Держите ваш API-ключ в секрете.**
|
||||
|
||||
Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
|
||||
Любой, у кого есть ваш API-ключ, может получить доступ к данным вашего рабочего пространства и изменять их. Никогда не добавляйте его в репозитории кода и не публикуйте публично.
|
||||
</Warning>
|
||||
|
||||
### Step 2: Choose Your API
|
||||
### Шаг 2: Выберите API
|
||||
|
||||
Twenty supports two API types:
|
||||
Twenty поддерживает два типа API:
|
||||
|
||||
| API | Best For | Документация |
|
||||
| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
|
||||
| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/ru/developers/extend/capabilities/apis) |
|
||||
| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/ru/developers/extend/capabilities/apis) |
|
||||
| API | Лучше всего подходит для | Документация |
|
||||
| ----------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
|
||||
| **GraphQL** | Гибкие запросы, получение связанных данных, сложные операции | [Документация по API](/l/ru/developers/extend/capabilities/apis) |
|
||||
| **REST** | Простые операции CRUD, привычные шаблоны REST | [Документация по API](/l/ru/developers/extend/capabilities/apis) |
|
||||
|
||||
Both APIs support:
|
||||
Оба API поддерживают:
|
||||
|
||||
* Creating, reading, updating, and deleting records
|
||||
* **Batch operations** — create or update up to 60 records per call
|
||||
* Создание, чтение, обновление и удаление записей
|
||||
* **Пакетные операции** — создание или обновление до 60 записей за один вызов
|
||||
|
||||
**For imports, use batch operations** to maximize throughput within rate limits.
|
||||
**Для импорта используйте пакетные операции**, чтобы максимизировать пропускную способность в рамках лимитов.
|
||||
|
||||
### Step 3: Plan Your Import Order
|
||||
### Шаг 3: Спланируйте порядок импорта
|
||||
|
||||
Just like CSV imports, **order matters** for relations:
|
||||
Как и при импорте CSV, для связей **важен порядок**:
|
||||
|
||||
1. **Companies** first (no dependencies)
|
||||
2. **People** second (can link to Companies)
|
||||
3. **Opportunities** third (can link to Companies and People)
|
||||
4. **Tasks/Notes** (can link to any of the above)
|
||||
5. **Custom objects** (following their dependencies)
|
||||
1. **Компании** в первую очередь (без зависимостей)
|
||||
2. **Контакты** во вторую очередь (могут быть связаны с компаниями)
|
||||
3. **Возможности** в третью очередь (могут быть связаны с компаниями и контактами)
|
||||
4. **Задачи/Заметки** (могут быть связаны с любым из вышеперечисленных)
|
||||
5. **Пользовательские объекты** (с учётом их зависимостей)
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### Batch Your Requests
|
||||
### Объединяйте запросы в пакеты
|
||||
|
||||
* Don't send records one at a time
|
||||
* Group up to **60 records per API call**
|
||||
* This maximizes throughput within rate limits
|
||||
* Не отправляйте записи по одной
|
||||
* Группируйте до **60 записей на один вызов API**
|
||||
* Так вы максимально используете пропускную способность в рамках лимитов
|
||||
|
||||
### Handle Rate Limits
|
||||
### Обрабатывайте ограничения скорости
|
||||
|
||||
* Implement delays between requests (600ms minimum for sustained imports)
|
||||
* Use exponential backoff when you hit limits
|
||||
* Monitor for 429 (Too Many Requests) responses
|
||||
* Реализуйте задержки между запросами (минимум 600 мс для длительных импортов)
|
||||
* При достижении лимитов используйте экспоненциальное увеличение интервала повторных попыток
|
||||
* Отслеживайте ответы 429 (Too Many Requests)
|
||||
|
||||
### Validate Data First
|
||||
### Сначала проверьте данные
|
||||
|
||||
* Clean and validate your data before importing
|
||||
* Check required fields are populated
|
||||
* Verify formats match Twenty's requirements (see [Field Mapping](/l/ru/user-guide/data-migration/capabilities/field-mapping))
|
||||
* Очистите и проверьте данные перед импортом
|
||||
* Проверьте, что обязательные поля заполнены
|
||||
* Убедитесь, что форматы соответствуют требованиям Twenty (см. [Сопоставление полей](/l/ru/user-guide/data-migration/capabilities/field-mapping))
|
||||
|
||||
### Log Everything
|
||||
### Логируйте всё
|
||||
|
||||
* Log every record imported (including IDs)
|
||||
* Log errors with full context
|
||||
* This helps debug issues and verify completion
|
||||
* Логируйте каждую импортированную запись (включая идентификаторы)
|
||||
* Логируйте ошибки с полным контекстом
|
||||
* Это помогает устранять неполадки и подтверждать завершение
|
||||
|
||||
### Test First
|
||||
### Сначала протестируйте
|
||||
|
||||
* Test with a small batch (10-20 records)
|
||||
* Verify data appears correctly in Twenty
|
||||
* Then run the full import
|
||||
* Протестируйте на небольшой выборке (10-20 записей)
|
||||
* Проверьте, что данные корректно отображаются в Twenty
|
||||
* Затем запустите полный импорт
|
||||
|
||||
### Upsert to Avoid Duplicates
|
||||
### Upsert для предотвращения дубликатов
|
||||
|
||||
The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
|
||||
GraphQL API поддерживает **пакетный upsert** — обновление, если запись существует, и создание, если нет. Это предотвращает дубликаты при повторном запуске импорта.
|
||||
|
||||
## Finding Object and Field Names
|
||||
## Поиск названий объектов и полей
|
||||
|
||||
To see available objects and fields:
|
||||
Чтобы увидеть доступные объекты и поля:
|
||||
|
||||
1. Go to **Settings → API and Webhooks**
|
||||
2. Browse the **Metadata API**
|
||||
3. View all standard and custom objects with their fields
|
||||
1. Перейдите в **Настройки → API и вебхуки**
|
||||
2. Просмотрите **Metadata API**
|
||||
3. Просмотрите все стандартные и пользовательские объекты и их поля
|
||||
|
||||
The documentation shows all standard and custom objects, their fields, and the expected data types.
|
||||
В документации перечислены все стандартные и пользовательские объекты, их поля и ожидаемые типы данных.
|
||||
|
||||
## Профессиональные услуги
|
||||
|
||||
For complex API migrations, our partners can help:
|
||||
Для сложных миграций по API наши партнёры могут помочь:
|
||||
|
||||
| Service | What's Included |
|
||||
| ----------------------- | ---------------------------------- |
|
||||
| **Data Model Design** | design your optimal data structure |
|
||||
| **Migration Scripts** | write and run the import scripts |
|
||||
| **Data Transformation** | handle complex mapping and cleanup |
|
||||
| **Validation & QA** | verify the migration is complete |
|
||||
| Услуга | Что включено |
|
||||
| -------------------------------- | ------------------------------------------------- |
|
||||
| **Проектирование модели данных** | проектирование оптимальной структуры данных |
|
||||
| **Скрипты миграции** | написание и запуск скриптов импорта |
|
||||
| **Преобразование данных** | обработка сложного сопоставления и очистки данных |
|
||||
| **Проверка и контроль качества** | проверка завершённости миграции |
|
||||
|
||||
**Best for:**
|
||||
**Лучше всего подходит для:**
|
||||
|
||||
* Migrations of 100,000+ records
|
||||
* Complex data transformations
|
||||
* Tight timelines
|
||||
* Teams without developer resources
|
||||
* Миграции объёмом 100 000+ записей
|
||||
* Сложные преобразования данных
|
||||
* Сжатые сроки
|
||||
* Команды без ресурсов на разработку
|
||||
|
||||
Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ru/user-guide/getting-started/capabilities/implementation-services).
|
||||
Свяжитесь с нами по адресу [contact@twenty.com](mailto:contact@twenty.com) или изучите наши [услуги по внедрению](/l/ru/user-guide/getting-started/capabilities/implementation-services).
|
||||
|
||||
## FAQ
|
||||
## Часто задаваемые вопросы
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="What's the difference between GraphQL and REST?">
|
||||
GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
|
||||
<Accordion title="В чём разница между GraphQL и REST?">
|
||||
GraphQL позволяет запрашивать ровно те данные, которые нужны, в одном запросе и лучше подходит для сложных операций. REST использует стандартные методы HTTP (GET, POST, PUT, DELETE) и может быть более привычен, если вы работали с традиционными API.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I update existing records via API?">
|
||||
Да! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
|
||||
<Accordion title="Могу ли я обновлять существующие записи через API?">
|
||||
Да! Используйте мутации обновления (GraphQL) или запросы PUT/PATCH (REST) с `id` записи.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How do I handle duplicates?">
|
||||
Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
|
||||
<Accordion title="Как обрабатывать дубликаты?">
|
||||
Сначала запросите существующие записи, используя уникальные идентификаторы (email, домен). Обновляйте, если запись существует, и создавайте, если нет.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I delete records via API?">
|
||||
Yes, use delete mutations (GraphQL) or DELETE requests (REST).
|
||||
<Accordion title="Могу ли я удалять записи через API?">
|
||||
Да, используйте мутации удаления (GraphQL) или запросы DELETE (REST).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Is there a Python or Node.js SDK?">
|
||||
Not currently, but both APIs work with any HTTP client in any language.
|
||||
<Accordion title="Есть ли SDK для Python или Node.js?">
|
||||
Пока нет, но оба API работают с любым HTTP-клиентом на любом языке.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## API Documentation
|
||||
## Документация по API
|
||||
|
||||
For full implementation details, code examples, and schema reference:
|
||||
Полная информация о реализации, примеры кода и справочник по схеме:
|
||||
|
||||
* [API Documentation](/l/ru/developers/extend/capabilities/apis)
|
||||
* [Документация по API](/l/ru/developers/extend/capabilities/apis)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Объекты
|
||||
description: Learn about standard and custom objects in Twenty.
|
||||
description: Узнайте о стандартных и пользовательских объектах в Twenty.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
@@ -25,11 +25,11 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
### Заметки
|
||||
|
||||
The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
|
||||
Объект `Notes` хранит произвольные заметки, которые можно прикреплять к записям «Люди», «Компании», «Сделки» и другим записям. Используйте заметки, чтобы фиксировать итоги встреч, важные подробности и другую контекстную информацию.
|
||||
|
||||
### Задачи
|
||||
|
||||
The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
|
||||
Объект `Tasks` хранит задачи и поручения. Задачи можно связывать с записями «Люди», «Компании», «Сделки» и другими записями. Отслеживайте сроки, исполнителей и статус выполнения, чтобы не упускать последующие действия.
|
||||
|
||||
## Пользовательские объекты
|
||||
|
||||
@@ -37,55 +37,55 @@ The `Tasks` object stores to-dos and action items. Tasks can be linked to People
|
||||
|
||||
<img src="/images/user-guide/objects/custom-objects.png" style={{width:'100%'}} />
|
||||
|
||||
### Creating a New Custom Object
|
||||
### Создание нового пользовательского объекта
|
||||
|
||||
Чтобы создать новый пользовательский объект:
|
||||
|
||||
1. Перейдите в Настройки в боковой панели слева.
|
||||
2. Under Workspace, go to Data model. Здесь вы сможете увидеть обзор всех ваших существующих Стандартных и Пользовательских объектов (как активных, так и отключенных).
|
||||
2. В разделе «Рабочее пространство» перейдите к «Модели данных». Здесь вы сможете увидеть обзор всех ваших существующих Стандартных и Пользовательских объектов (как активных, так и отключенных).
|
||||
|
||||
<VimeoEmbed videoId="926288174" title="Видеодемонстрация" />
|
||||
|
||||
3. Нажмите на `+ Новый объект` вверху. Введите имя (как в единственном, так и во множественном числе), выберите значок и добавьте описание для вашего пользовательского объекта, а затем нажмите Сохранить (в правом верхнем углу). Используя Листинг как пример пользовательского объекта, единственное число будет "листинг", а множественное - "листинги", вместе с описанием, например, "Листинги, которые хозяева создали для показа своей собственности."
|
||||
|
||||
4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
|
||||
4. Ваш пользовательский объект создан и появится в боковой панели. Вы можете сразу начать добавлять в него записи.
|
||||
|
||||
## Managing Objects
|
||||
## Управление объектами
|
||||
|
||||
### Deactivating Objects
|
||||
### Деактивация объектов
|
||||
|
||||
If you don't need a standard or custom object:
|
||||
Если вам не нужен стандартный или пользовательский объект:
|
||||
|
||||
1. Go to Settings → Data Model
|
||||
2. Find the object you want to deactivate
|
||||
3. Click the toggle to deactivate it
|
||||
4. The object will be hidden from your workspace but data is preserved
|
||||
1. Перейдите в Настройки → Модель данных
|
||||
2. Найдите объект, который нужно деактивировать
|
||||
3. Щелкните переключатель, чтобы деактивировать его
|
||||
4. Объект будет скрыт в вашем рабочем пространстве, но данные сохранятся
|
||||
|
||||
### Reactivating Objects
|
||||
### Повторная активация объектов
|
||||
|
||||
To bring back a deactivated object:
|
||||
Чтобы вернуть деактивированный объект:
|
||||
|
||||
1. Go to Settings → Data Model
|
||||
2. Look for deactivated objects (they'll be grayed out)
|
||||
3. Click the toggle to reactivate it
|
||||
4. The object and all its data will be restored
|
||||
1. Перейдите в Настройки → Модель данных
|
||||
2. Найдите деактивированные объекты (они отображаются серым цветом)
|
||||
3. Щелкните переключатель, чтобы активировать его снова
|
||||
4. Объект и все его данные будут восстановлены
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### When to Create Custom Objects
|
||||
### Когда создавать пользовательские объекты
|
||||
|
||||
* **Unique business entities**: Things specific to your industry or process
|
||||
* **Complex relationships**: When you need to track connections between multiple entities
|
||||
* **Scalable data**: When you might have many instances of something
|
||||
* **Уникальные бизнес-сущности**: Объекты, специфичные для вашей отрасли или процесса
|
||||
* **Сложные связи**: Когда нужно отслеживать связи между несколькими сущностями
|
||||
* **Масштабируемые данные**: Когда у чего-то может быть много экземпляров
|
||||
|
||||
### When to Use Fields Instead
|
||||
### Когда лучше использовать поля
|
||||
|
||||
* **Simple attributes**: Properties that describe existing objects
|
||||
* **Categories or labels**: Ways to classify existing records
|
||||
* **Single values**: Information that doesn't need its own lifecycle
|
||||
* **Простые атрибуты**: Свойства, описывающие существующие объекты
|
||||
* **Категории или метки**: Способы классификации существующих записей
|
||||
* **Одиночные значения**: Информация, которой не требуется собственный жизненный цикл
|
||||
|
||||
### Object Naming
|
||||
### Именование объектов
|
||||
|
||||
* **Use clear, descriptive names**: Make it obvious what the object represents
|
||||
* **Follow conventions**: Use singular for the object name, plural for the collection
|
||||
* **Consider your team**: Choose names everyone will understand
|
||||
* **Используйте понятные, описательные названия**: Сделайте очевидным, что представляет собой объект
|
||||
* **Следуйте соглашениям**: Используйте единственное число для названия объекта и множественное — для коллекции
|
||||
* **Учитывайте свою команду**: Выбирайте названия, которые будут понятны всем
|
||||
|
||||
@@ -1,51 +1,51 @@
|
||||
---
|
||||
title: Create Custom Objects
|
||||
description: Step-by-step guide to creating custom objects in Twenty.
|
||||
title: Создание пользовательских объектов
|
||||
description: Пошаговое руководство по созданию пользовательских объектов в Twenty.
|
||||
---
|
||||
|
||||
Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
|
||||
Пользовательские объекты позволяют хранить информацию, уникальную для вашего бизнеса, которую стандартные объекты не охватывают. Например: проекты, товары, заявки или объявления.
|
||||
|
||||
<Note>
|
||||
**Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/ru/user-guide/data-model/overview) for guidance.
|
||||
**Не уверены, нужен объект или поле?** См. [Понимание вашей модели данных](/l/ru/user-guide/data-model/overview) для получения рекомендаций.
|
||||
</Note>
|
||||
|
||||
## Steps
|
||||
## Шаги
|
||||
|
||||
1. Go to **Settings → Data Model**
|
||||
2. Click **+ New object**
|
||||
3. Fill in:
|
||||
* **Singular name** (e.g., "Listing")
|
||||
* **Plural name** (e.g., "Listings")
|
||||
* **Icon**
|
||||
* **Description** (optional)
|
||||
1. Перейдите в **Настройки → Модель данных**
|
||||
2. Нажмите **+ Новый объект**
|
||||
3. Заполните:
|
||||
* **Имя в единственном числе** (например, "Listing")
|
||||
* **Имя во множественном числе** (например, "Listings")
|
||||
* **Иконка**
|
||||
* **Описание** (необязательно)
|
||||
4. Нажмите **Сохранить**
|
||||
|
||||
Your object appears in the sidebar immediately.
|
||||
Ваш объект сразу появится в боковой панели.
|
||||
|
||||
## Next: Add Fields
|
||||
## Далее: добавьте поля
|
||||
|
||||
New objects start with basic fields. Add custom fields to capture the data you need:
|
||||
Новые объекты изначально содержат базовые поля. Добавьте пользовательские поля, чтобы собирать нужные данные:
|
||||
|
||||
1. In **Settings → Data Model**, select your object
|
||||
2. Click **+ Add Field**
|
||||
3. Choose a field type, configure, and save
|
||||
1. В разделе **Настройки → Модель данных** выберите свой объект
|
||||
2. Нажмите **+ Добавить поле**
|
||||
3. Выберите тип поля, настройте и сохраните
|
||||
|
||||
See [How to Create Custom Fields](/l/ru/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
|
||||
См. [Как создать пользовательские поля](/l/ru/user-guide/data-model/how-tos/create-custom-fields) для подробностей о типах полей и настройке.
|
||||
|
||||
## Connecting to Other Objects
|
||||
## Связывание с другими объектами
|
||||
|
||||
To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/ru/user-guide/data-model/how-tos/create-relation-fields).
|
||||
Чтобы связать ваш объект с людьми, компаниями или другими объектами, создайте поле связи. См. [Как создать поля связей](/l/ru/user-guide/data-model/how-tos/create-relation-fields).
|
||||
|
||||
## Deactivating an Object
|
||||
## Деактивация объекта
|
||||
|
||||
If you no longer need an object:
|
||||
Если объект больше не нужен:
|
||||
|
||||
1. Go to **Settings → Data Model**
|
||||
2. Toggle the object off
|
||||
1. Перейдите в **Настройки → Модель данных**
|
||||
2. Отключите объект
|
||||
|
||||
The object is hidden but data is preserved. You can reactivate or permanently delete later.
|
||||
Объект будет скрыт, но данные сохранятся. Позже вы сможете повторно активировать или удалить навсегда.
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Объекты](/l/ru/user-guide/data-model/capabilities/objects) — стандартные и пользовательские объекты
|
||||
* [Частые вопросы о модели данных](/l/ru/user-guide/data-model/how-tos/data-model-faq) — распространённые вопросы
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
---
|
||||
title: Часто задаваемые вопросы о модели данных
|
||||
description: Frequently asked questions about Twenty's data model.
|
||||
description: Часто задаваемые вопросы о модели данных Twenty.
|
||||
---
|
||||
|
||||
## Управление объектами
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Can I delete a custom object?">
|
||||
Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
|
||||
<Accordion title="Могу ли я удалить пользовательский объект?">
|
||||
Да, пользовательские объекты можно удалять. Вы также можете сначала деактивировать их, что скрывает объект и его данные из интерфейса, сохраняя при этом данные.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Могу ли я удалить стандартные объекты (Люди, Компании и т.д.)?">
|
||||
No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
|
||||
Нет, стандартные объекты не могут быть удалены. Их можно только деактивировать: это скрывает их из интерфейса, но сохраняет данные.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How many custom objects can I create?">
|
||||
You can create as many custom objects and fields as you need — the price doesn't change.
|
||||
<Accordion title="Сколько пользовательских объектов я могу создать?">
|
||||
Вы можете создать столько пользовательских объектов и полей, сколько вам нужно — цена не изменится.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I rename a standard object?">
|
||||
You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
|
||||
<Accordion title="Могу ли я переименовать стандартный объект?">
|
||||
Вы можете переименовать метку стандартных объектов (Люди, Компании, Сделки), но не их имена API. Имена API фиксированы для единообразия во всех рабочих пространствах Twenty.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I change an object's icon?">
|
||||
Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
|
||||
<Accordion title="Могу ли я изменить значок объекта?">
|
||||
Да, вы можете изменить значок как стандартных, так и пользовательских объектов в разделе **Настройки → Модель данных**.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Могу ли я переупорядочить объекты в левой панели навигации?">
|
||||
@@ -38,8 +38,8 @@ description: Frequently asked questions about Twenty's data model.
|
||||
## Возможности полей
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Can I change a field type after creation?">
|
||||
No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
|
||||
<Accordion title="Могу ли я изменить тип поля после создания?">
|
||||
Нет, типы полей нельзя изменить после создания. Если вам нужен другой тип, создайте новое поле с правильным типом, перенесите данные, затем деактивируйте старое поле.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Почему мне нужны разные формы для единственного и множественного числа?">
|
||||
@@ -55,21 +55,21 @@ description: Frequently asked questions about Twenty's data model.
|
||||
Определенные названия полей, такие как `Тип` или `Приложение`, зарезервированы для системного использования. Выбирайте альтернативные названия, такие как `Категория` или `Классификация`.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What happens when I deactivate a field?">
|
||||
* The field is hidden from the interface
|
||||
* Existing data is preserved
|
||||
* You can still access the field via API
|
||||
* Existing relations remain but you can't create new ones
|
||||
* You can reactivate the field later
|
||||
<Accordion title="Что происходит, когда я деактивирую поле?">
|
||||
* Поле скрывается из интерфейса
|
||||
* Существующие данные сохраняются
|
||||
* Вы по-прежнему можете получить доступ к полю через API
|
||||
* Существующие отношения сохраняются, но вы не можете создавать новые
|
||||
* Вы можете повторно активировать поле позже
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I make a field required?">
|
||||
Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
|
||||
<Accordion title="Могу ли я сделать поле обязательным?">
|
||||
На данный момент сделать пользовательские поля обязательными нельзя. Все поля допускают пустые значения. Вы можете использовать рабочие процессы, чтобы обеспечить обязательность полей, отправляя уведомления или блокируя действия, когда поля пусты.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between unique and required?">
|
||||
* **Unique**: No two records can have the same value in this field
|
||||
* **Required**: The field must have a value (not currently supported for custom fields)
|
||||
<Accordion title="В чём разница между уникальным и обязательным?">
|
||||
* **Уникальное**: две записи не могут иметь одно и то же значение в этом поле
|
||||
* **Обязательное**: в поле должно быть значение (в настоящее время не поддерживается для пользовательских полей)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Могу ли я создавать поля-формулы?">
|
||||
@@ -81,44 +81,44 @@ description: Frequently asked questions about Twenty's data model.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Могу ли я переупорядочивать поля в объектах?">
|
||||
Переупорядочивание полей будет доступно вместе с настраиваемыми макетами в **Q4 2025**. Currently, fields appear in alphabetical order.
|
||||
Переупорядочивание полей будет доступно вместе с настраиваемыми макетами в **Q4 2025**. На данный момент поля отображаются в алфавитном порядке.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Связи
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Can I have a relation pointing to the same object?">
|
||||
Да! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
|
||||
<Accordion title="Могу ли я создать отношение, указывающее на тот же объект?">
|
||||
Да! Отношения, ссылающиеся на тот же объект, поддерживаются и рекомендуются для таких случаев, как иерархии учётных записей. Например, создайте отношение из Компаний к Компаниям, чтобы отслеживать родительские и дочерние учётные записи.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Могу ли я создавать отношения многие-ко-многим?">
|
||||
Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
|
||||
Отношения многие-ко-многим появятся в **H1 2026**. На данный момент создайте промежуточный объект с двумя отношениями один-ко-многим в качестве временного решения.
|
||||
|
||||
For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
|
||||
Например, чтобы связать Людей и Проекты (многие-ко-многим), создайте объект "Назначения по проектам" с:
|
||||
|
||||
* A relation to People (many assignments → one person)
|
||||
* A relation to Projects (many assignments → one project)
|
||||
* Связь с Людьми (много назначений → один человек)
|
||||
* Связь с Проектами (много назначений → один проект)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What are relations to multiple object types (Morph relationships)?">
|
||||
These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
|
||||
<Accordion title="Что такое отношения к нескольким типам объектов (Morph-отношения)?">
|
||||
Они позволяют одному объекту связываться с несколькими различными типами объектов через одно поле. Например, Заметки могут одновременно быть прикреплены к Людям И Компаниям И Сделкам.
|
||||
|
||||
Each Note links to one Person, one Company, and one Opportunity at the same time.
|
||||
Каждая Заметка одновременно связана с одним Человеком, одной Компанией и одной Сделкой.
|
||||
|
||||
Learn more in [Relation Fields](/l/ru/user-guide/data-model/capabilities/relation-fields).
|
||||
Подробнее см. в разделе [Поля связей](/l/ru/user-guide/data-model/capabilities/relation-fields).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I have multiple relations between the same objects?">
|
||||
Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
|
||||
<Accordion title="Могу ли я создать несколько отношений между одними и теми же объектами?">
|
||||
Да, вы можете создать несколько отношений между одними и теми же двумя объектами. Например, у Компании могут быть отношения "Основной контакт" и "Контакт для выставления счетов" к Людям.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What happens to relations when I delete a record?">
|
||||
When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
|
||||
<Accordion title="Что происходит с отношениями, когда я удаляю запись?">
|
||||
Когда вы удаляете запись, связь удаляется из связанных записей. Связанные записи не удаляются.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I create circular relations?">
|
||||
While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
|
||||
<Accordion title="Могу ли я создать циклические отношения?">
|
||||
Хотя это технически возможно, циклических отношений (A → B → C → A) следует избегать, поскольку они могут вызывать путаницу и потенциальные проблемы с производительностью.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -126,7 +126,7 @@ description: Frequently asked questions about Twenty's data model.
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Где я могу увидеть и изменить мою модель данных?">
|
||||
Go to **Settings → Data Model** to view and edit all your objects and fields.
|
||||
Перейдите в раздел **Настройки → Модель данных**, чтобы просмотреть и редактировать все свои объекты и поля.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Почему я не вижу Модель данных в настройках?">
|
||||
@@ -134,22 +134,22 @@ description: Frequently asked questions about Twenty's data model.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Data Management
|
||||
## Управление данными
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Is there a limit to how many records I can have?">
|
||||
There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
|
||||
<Accordion title="Есть ли ограничение на количество записей?">
|
||||
Жёстких ограничений на количество записей нет. Однако очень большие наборы данных могут повлиять на производительность в некоторых представлениях. Используйте фильтры и представления, чтобы эффективно работать с большими наборами данных.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I import data into custom objects?">
|
||||
Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files).
|
||||
<Accordion title="Могу ли я импортировать данные в пользовательские объекты?">
|
||||
Да, вы можете импортировать данные CSV в любой объект, включая пользовательские объекты. Процесс импорта поддерживает сопоставление пользовательских полей. См. [как подготовить файлы CSV](/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I export my data model configuration?">
|
||||
Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
|
||||
<Accordion title="Могу ли я экспортировать конфигурацию модели данных?">
|
||||
На данный момент встроенного экспорта конфигурации модели данных нет. Свяжитесь со службой поддержки, если вам нужно перенести модель данных между рабочими пространствами.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Нужна дополнительная помощь?
|
||||
|
||||
Check our [Implementation Services](/l/ru/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
|
||||
Ознакомьтесь с нашими [услугами по внедрению](/l/ru/user-guide/getting-started/capabilities/implementation-services), чтобы получить помощь в разработке сложной модели данных.
|
||||
|
||||
@@ -121,55 +121,55 @@ Twenty предоставляет полную гибкость:
|
||||
|
||||
### 5. Сначала — простота
|
||||
|
||||
Начните с полей. Move to new objects only when you feel the limits:
|
||||
Начните с полей. Переходите к новым объектам только когда почувствуете ограничения:
|
||||
|
||||
* Too many fields on one object
|
||||
* Repeated records that should be separate
|
||||
* Relationships that don't fit neatly
|
||||
* Слишком много полей в одном объекте
|
||||
* Повторяющиеся записи, которые должны быть отдельными
|
||||
* Связи, которые не вписываются должным образом
|
||||
|
||||
## Special Note on People, Companies, and Opportunities
|
||||
## Специальная заметка по Людям, Компаниям и Возможностям
|
||||
|
||||
<Warning>
|
||||
**Email and calendar sync only works with People, Companies, and Opportunities.**
|
||||
**Синхронизация электронной почты и календаря работает только с Людьми, Компаниями и Возможностями.**
|
||||
|
||||
These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
|
||||
Это единственные объекты, в которых вы можете получить доступ к синхронизированным письмам и встречам из вашего почтового ящика/календаря. Рекомендуем по возможности использовать их.
|
||||
</Warning>
|
||||
|
||||
**Best practices:**
|
||||
**Лучшие практики:**
|
||||
|
||||
* If you need categories of People, use fields (not new objects)
|
||||
* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
|
||||
* Create different **views** to filter: one showing partners, another showing prospects
|
||||
* Если вам нужны категории Людей, используйте поля (а не новые объекты)
|
||||
* Пример: используйте поле `Person Type` со значениями "Потенциальный клиент" и "Партнёр" вместо создания отдельных объектов
|
||||
* Создайте разные **представления** для фильтрации: одно — для партнёров, другое — для потенциальных клиентов
|
||||
|
||||
**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
|
||||
**Допустимо иметь поля, которые применимы не к каждой записи.** Например, поле `Referral Link` у Людей, которое применяется только когда `Person Type = Partner`. Скройте это поле в представлениях, где оно не актуально.
|
||||
|
||||
## Questions to Guide Your Choice
|
||||
## Вопросы, которые помогут сделать выбор
|
||||
|
||||
Спросите себя:
|
||||
|
||||
<Check>Is this just a property of something I already have, or does it need its own properties?</Check>
|
||||
<Check>Will I ever need to track multiple of these per record, without knowing how many?</Check>
|
||||
<Check>Does this concept connect to several different objects, not just one?</Check>
|
||||
<Check>Will it have its own lifecycle (stages, start/end dates)?</Check>
|
||||
<Check>Является ли это просто свойством того, что у меня уже есть, или ему нужны свои собственные свойства?</Check>
|
||||
<Check>Понадобится ли мне когда-нибудь отслеживать несколько таких для одной записи, не зная заранее, сколько?</Check>
|
||||
<Check>Связывается ли эта концепция с несколькими разными объектами, а не только с одним?</Check>
|
||||
<Check>Будет ли у неё собственный жизненный цикл (стадии, даты начала/окончания)?</Check>
|
||||
|
||||
If the answer is "yes" to one or more, it's probably time for a new object.
|
||||
Если хотя бы на один из них ответ «да», вероятно, пришло время для нового объекта.
|
||||
|
||||
## Accessing Your Data Model
|
||||
## Доступ к вашей модели данных
|
||||
|
||||
1. Go to **Settings** in the left sidebar
|
||||
2. Click **Data Model**
|
||||
3. View all your objects (standard and custom)
|
||||
4. Click any object to see and edit its fields
|
||||
1. Перейдите в **Настройки** в левой боковой панели
|
||||
2. Нажмите **Модель данных**
|
||||
3. Просмотрите все ваши объекты (стандартные и пользовательские)
|
||||
4. Нажмите любой объект, чтобы просмотреть и отредактировать его поля
|
||||
|
||||
<Note>
|
||||
**Don't see Data Model in Settings?**
|
||||
**Не видите «Модель данных» в настройках?**
|
||||
|
||||
Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
|
||||
Доступ к модели данных обычно ограничен администраторами. Свяжитесь с администратором рабочего пространства, если вам нужен доступ.
|
||||
</Note>
|
||||
|
||||
## Следующие шаги
|
||||
|
||||
Once you've planned your data model:
|
||||
После того как вы спланировали модель данных:
|
||||
|
||||
* [Как создать пользовательские объекты](/l/ru/user-guide/data-model/how-tos/create-custom-objects)
|
||||
* [Как создать пользовательские поля](/l/ru/user-guide/data-model/how-tos/create-custom-fields)
|
||||
@@ -177,4 +177,4 @@ Once you've planned your data model:
|
||||
|
||||
## Нужна Помощь?
|
||||
|
||||
Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/ru/user-guide/getting-started/capabilities/implementation-services).
|
||||
Наша команда может помочь вам в разработке и создании необходимой модели данных. Узнайте о наших [услугах по внедрению](/l/ru/user-guide/getting-started/capabilities/implementation-services).
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Glossary
|
||||
title: Глоссарий
|
||||
description: Ознакомьтесь с основными терминами, используемыми в Twenty.
|
||||
---
|
||||
|
||||
@@ -7,13 +7,13 @@ description: Ознакомьтесь с основными терминами,
|
||||
|
||||
API (интерфейс программирования приложений) позволяет подключать Twenty к другим программным системам и создавать пользовательские интеграции.
|
||||
|
||||
## Apps
|
||||
## Приложения
|
||||
|
||||
Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
|
||||
Приложения — это настраиваемые расширения, создаваемые в виде кода, которые могут определять модели данных и бессерверные функции. Они позволяют разработчикам создавать повторно используемые пользовательские настройки, которые можно развертывать в нескольких рабочих пространствах.
|
||||
|
||||
## Code Actions
|
||||
## Действия кода
|
||||
|
||||
Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
|
||||
Действия кода — это шаги рабочего процесса, которые позволяют писать пользовательский JavaScript для преобразования данных, выполнения вычислений или реализации сложной логики, недоступной во встроенных действиях.
|
||||
|
||||
## Меню команд
|
||||
|
||||
@@ -44,7 +44,7 @@ CRM имеет два основных типа записей:
|
||||
|
||||
## Итератор
|
||||
|
||||
An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
|
||||
Итератор — это действие рабочего процесса, которое перебирает массив элементов, выполняя последующие действия для каждого элемента в списке.
|
||||
|
||||
## Канбан
|
||||
|
||||
@@ -76,7 +76,7 @@ An Iterator is a workflow action that loops through an array of items, executing
|
||||
|
||||
## Триггеры
|
||||
|
||||
Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
|
||||
Триггеры — отправная точка рабочего процесса — событие или условие, которое инициирует автоматизацию. К примерам относятся создание и обновление записей, вебхуки или запланированное время.
|
||||
|
||||
## Представления
|
||||
|
||||
@@ -84,7 +84,7 @@ Triggers are the starting point of a workflow — the event or condition that in
|
||||
|
||||
## Upsert
|
||||
|
||||
Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
|
||||
Upsert — это операция, сочетающая "update" и "insert" — она обновляет существующую запись, если найдено совпадение, или создает новую запись, если совпадения нет.
|
||||
|
||||
## Вебхуки
|
||||
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ description: Нужна ли вам помощь в начале работы и
|
||||
|
||||
## Пакеты внедрения
|
||||
|
||||
Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
|
||||
Получите помощь от нашей основной команды, чтобы настроить ваше рабочее пространство Twenty с нашими 4-часовыми пакетами внедрения:
|
||||
|
||||
* **Проектирование модели данных**: Разрабатывайте и создавайте свою собственную модель данных с объектами, полями и отношениями
|
||||
* **Миграция данных**: Переносите существующие данные из вашей текущей CRM в Twenty
|
||||
@@ -13,4 +13,4 @@ Get help from our core team to set up your Twenty workspace with our 4-hour Onbo
|
||||
|
||||
## Партнеры по внедрению
|
||||
|
||||
Работайте с сертифицированными партнерами Twenty для более сложных настроек и интеграций. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
|
||||
Работайте с сертифицированными партнерами Twenty для более сложных настроек и интеграций. Свяжитесь с нашей командой по адресу [contact@twenty.com](mailto:contact@twenty.com), чтобы мы подобрали для вас партнеров.
|
||||
|
||||
+6
-6
@@ -1,9 +1,9 @@
|
||||
---
|
||||
title: Configure Your Workspace
|
||||
description: Каждый бизнес работает по-своему. Start with these 3 steps to shape Twenty around your needs.
|
||||
title: Настройка вашего рабочего пространства
|
||||
description: Каждый бизнес работает по-своему. Начните с этих 3 шагов, чтобы настроить Twenty под ваши потребности.
|
||||
---
|
||||
|
||||
<Note>**Quick Win**: Start with connecting your mailbox. Это обеспечивает мгновенную отдачу и помогает вашей команде увидеть Twenty в действии с реальными данными. You can do so under Settings → Accounts.</Note>
|
||||
<Note>**Быстрый результат**: Начните с подключения вашего почтового ящика. Это обеспечивает мгновенную отдачу и помогает вашей команде увидеть Twenty в действии с реальными данными. Вы можете сделать это в разделе Настройки → Учетные записи.</Note>
|
||||
|
||||
## 1. Настройте свою модель данных
|
||||
|
||||
@@ -12,10 +12,10 @@ Twenty предлагает гибкость, необходимую для со
|
||||
Вот несколько советов:
|
||||
|
||||
* **Вы не ограничены в количестве пользовательских полей и объектов.** Добавление пользовательских объектов и полей не приведет к повышению вашего тарифа. Добавление пользовательских объектов и полей не приведет к повышению вашего тарифа.
|
||||
* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. Мы рекомендуем использовать их как можно чаще, добавляя поля для категоризации ваших записей, если это необходимо. Вот пример:
|
||||
* **Люди, Компании и Возможности — это три объекта, через которые вы можете получить доступ к электронным письмам и встречам, синхронизированным с вашей почтой и календарём**. Мы рекомендуем использовать их как можно чаще, добавляя поля для категоризации ваших записей, если это необходимо. Вот пример:
|
||||
* Лучше всего использовать объект Люди для своих клиентов и партнеров, создавая поле в объекте Люди с именем `Тип Персоны`, а не создавать пользовательский объект Партнёр. Потому что вы не сможете получить доступ к электронной почте, обмененной с этим человеком из записей партнёра.
|
||||
* Создайте разные представления в разделе Люди, одно для отображения партнёров и одно для отображения клиентов.
|
||||
* Two People cannot have the same email address. Две компании не могут использовать один и тот же домен.
|
||||
* Два человека не могут иметь один и тот же адрес электронной почты. Две компании не могут использовать один и тот же домен.
|
||||
* Вы можете деактивировать стандартные поля и объекты, которые не хотите использовать.
|
||||
* Вы можете скрыть поля из представлений: не бойтесь создавать поля, вам не нужно будет показывать их все.
|
||||
|
||||
@@ -34,7 +34,7 @@ Twenty предлагает гибкость, необходимую для со
|
||||
* Сохранять историю общения видимой для вашей команды
|
||||
|
||||
**Используете другого провайдера?**
|
||||
Вы можете добавить другую почту через SMTP или другой календарь через CalDAV. Go to **Settings → Accounts** to configure.
|
||||
Вы можете добавить другую почту через SMTP или другой календарь через CalDAV. Перейдите в **Настройки → Учетные записи**, чтобы настроить.
|
||||
|
||||
### Импортировать данные через csv
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Создать рабочее пространство
|
||||
description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
|
||||
description: Следуйте пошаговому руководству о том, как зарегистрироваться на Twenty, выбрать тарифный план и настроить учетную запись.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
+20
-20
@@ -1,35 +1,35 @@
|
||||
---
|
||||
title: Navigate Around Twenty
|
||||
title: Навигация по Twenty
|
||||
description: Быстрый обзор навигации по платформе и выполнению различных типов действий.
|
||||
---
|
||||
|
||||
## Основная компоновка
|
||||
|
||||
The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. Здесь происходит повседневная работа.
|
||||
Центр экрана — это **место, где живут ваши записи**: люди, компании, сделки, задачи, заметки, дашборды, рабочие процессы и любые другие созданные вами объекты. Здесь происходит повседневная работа.
|
||||
Вы можете **просматривать, изменять, удалять записи** оттуда, а также **создавать новые представления**.
|
||||
|
||||
<img src="/images/user-guide/home/main-layout.png" style={{width:'100%'}} />
|
||||
|
||||
## Панель навигации
|
||||
|
||||
On the left side, from the top to the bottom, you'll be able to:
|
||||
Слева, сверху вниз, вы сможете:
|
||||
|
||||
* Переключайтесь между несколькими рабочими пространствами с помощью выпадающего меню или создайте новое рабочее пространство
|
||||
* Используйте строку поиска (нажмите `/`, чтобы быстро перейти к ней)
|
||||
* Откройте раздел «Настройки»
|
||||
* Have direct access to your **Favourites views**. Избранное уникально для каждого пользователя.
|
||||
* Получать прямой доступ к своим **избранным представлениям**. Избранное уникально для каждого пользователя.
|
||||
* Переключайтесь между разными объектами
|
||||
* **Create automations** using workflows
|
||||
* **Создавайте автоматизации** с помощью рабочих процессов
|
||||
|
||||
<img src="/images/user-guide/home/navigation-bar.png" style={{width:'100%'}} />
|
||||
|
||||
## The Command Menu
|
||||
## Меню команд
|
||||
|
||||
The command menu gives you **quick access to actions** in Twenty. Вы можете получить к нему доступ двумя способами:
|
||||
Меню команд предоставляет **быстрый доступ к действиям** в Twenty. Вы можете получить к нему доступ двумя способами:
|
||||
|
||||
* **Клавиатурное сочетание**: Нажмите `Cmd + K` (Mac) или `Ctrl + K` (Windows)
|
||||
* **Mouse**: Click the three dots in the top right corner
|
||||
From there, you can:
|
||||
* **Мышь**: Щелкните по трем точкам в верхнем правом углу
|
||||
Оттуда вы можете:
|
||||
* Создавать новые записи
|
||||
* **Импортировать и экспортировать данные в формате CSV**
|
||||
* Создавать новые представления
|
||||
@@ -38,21 +38,21 @@ The command menu gives you **quick access to actions** in Twenty. Вы може
|
||||
|
||||
<img src="/images/user-guide/home/command-menu.png" style={{width:'100%'}} />
|
||||
|
||||
## The Search Bar
|
||||
## Строка поиска
|
||||
|
||||
The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
|
||||
К строке поиска можно получить доступ через Меню команд, в верхней части панели навигации, или нажав `/`, чтобы сразу перейти к ней. Поиск работает по всем объектам.
|
||||
|
||||
<img src="/images/user-guide/home/search-bar.png" style={{width:'100%'}} />
|
||||
|
||||
## The Side Panel
|
||||
## Боковая панель
|
||||
|
||||
When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
|
||||
Когда вы щелкаете по записи, справа появляется боковая панель. Это дает вам быстрый обзор ключевой информации о записи, при этом вы не переходите на другую страницу. Оттуда вы можете закрыть этот обзор или получить дополнительную информацию об этой записи, нажав кнопку «Открыть».
|
||||
|
||||
<img src="/images/user-guide/home/side-panel.png" style={{width:'100%'}} />
|
||||
|
||||
## Представления
|
||||
|
||||
Every object (like Opportunities or People) supports multiple views. Вы не ограничены в количестве представлений для объекта.
|
||||
Каждый объект (например, Сделки или Люди) поддерживает несколько представлений. Вы не ограничены в количестве представлений для объекта.
|
||||
|
||||
Используйте выпадающее меню в верхнем левом углу основной компоновки, чтобы переключаться между различными представлениями. Например:
|
||||
|
||||
@@ -60,11 +60,11 @@ Every object (like Opportunities or People) supports multiple views. Вы не
|
||||
* Используйте представление Group By для создания секций и повышения эффективности
|
||||
* Используйте фильтры, чтобы сосредоточиться на конкретных записях (например, лидах, созданных на прошлой неделе)
|
||||
* Сохраняйте отфильтрованные представления для повторного использования
|
||||
* Favourite views for fast access
|
||||
* Избранные представления для быстрого доступа
|
||||
|
||||
<img src="/images/user-guide/home/view-menu.png" style={{width:'100%'}} />
|
||||
|
||||
If you're new to Views, read our [Views & Pipelines guide](/l/ru/user-guide/views-pipelines/overview) to learn how to create and customize them.
|
||||
Если вы впервые работаете с представлениями, прочитайте наше [руководство по представлениям и воронкам](/l/ru/user-guide/views-pipelines/overview), чтобы узнать, как их создавать и настраивать.
|
||||
|
||||
## Настройки
|
||||
|
||||
@@ -77,8 +77,8 @@ If you're new to Views, read our [Views & Pipelines guide](/l/ru/user-guide/view
|
||||
* Пригласите членов команды и управляйте ролями пользователей
|
||||
* Редактируйте свой профиль и параметры рабочего пространства
|
||||
* Настройте выставление счетов и отслеживайте использование кредитов рабочих процессов
|
||||
* Discover and enable upcoming features (under Updates → Early Access)
|
||||
* **Access Support** to reach out via live chat
|
||||
* **Open the Documentation** to browse the User Guide and developer docs
|
||||
* Открывайте и включайте новые функции (в разделе Обновления → Ранний доступ)
|
||||
* **Откройте Поддержку**, чтобы обратиться в онлайн-чат
|
||||
* **Откройте документацию**, чтобы просматривать Руководство пользователя и документацию для разработчиков
|
||||
|
||||
<Note>If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.</Note>
|
||||
<Note>Если вы не видите все эти разделы в Настройках, обратитесь к администратору рабочего пространства — к некоторым из них доступ ограничен.</Note>
|
||||
|
||||
+62
-62
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Разрешения
|
||||
description: Control access to objects, fields, and settings with role-based permissions.
|
||||
description: Управляйте доступом к объектам, полям и настройкам с помощью разрешений на основе ролей.
|
||||
image: /images/user-guide/permissions/permissions.png
|
||||
---
|
||||
|
||||
@@ -17,7 +17,7 @@ image: /images/user-guide/permissions/permissions.png
|
||||
1. Перейдите в **Настройки → Роли**
|
||||
2. В разделе **Все роли** нажмите **+ Создать роль**
|
||||
3. Введите имя роли
|
||||
4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
|
||||
4. На вкладке **Разрешения** по умолчанию [настройте разрешения](#customize-permissions)
|
||||
5. Нажмите **Сохранить**, чтобы завершить
|
||||
|
||||
## Удалить роль
|
||||
@@ -30,7 +30,7 @@ image: /images/user-guide/permissions/permissions.png
|
||||
4. Нажмите **Подтвердить** в модальном окне
|
||||
|
||||
<Note>
|
||||
If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. Все роли, кроме **Администратора**, могут быть удалены. Всегда должен быть назначен хотя бы один участник на роль **Администратора**.
|
||||
Если роль удалена, любой участник рабочего пространства, назначенный на неё, будет автоматически переназначен на роль по умолчанию. Все роли, кроме **Администратора**, могут быть удалены. Всегда должен быть назначен хотя бы один участник на роль **Администратора**.
|
||||
</Note>
|
||||
|
||||
## Назначение ролей участникам
|
||||
@@ -58,82 +58,82 @@ image: /images/user-guide/permissions/permissions.png
|
||||
4. Новые участники рабочего пространства будут получать эту роль при присоединении
|
||||
|
||||
<Note>
|
||||
You can only assign roles to existing workspace members. Чтобы пригласить новых участников, используйте [Управление членами](/l/ru/user-guide/settings/capabilities/member-management).
|
||||
Вы можете назначать роли только существующим участникам рабочего пространства. Чтобы пригласить новых участников, используйте [Управление членами](/l/ru/user-guide/settings/capabilities/member-management).
|
||||
</Note>
|
||||
|
||||
## Настроить разрешения
|
||||
|
||||
Разрешения определяют, что каждая роль может получить доступ или изменить в вашем рабочем пространстве, включая объекты и записи рабочего пространства, настройки и действия.
|
||||
|
||||
### Object Permissions
|
||||
### Разрешения на уровне объекта
|
||||
|
||||
The **Objects** section controls what this role can do with records across your workspace.
|
||||
Раздел **Объекты** определяет, что эта роль может делать с записями во всём вашем рабочем пространстве.
|
||||
|
||||
#### Set Default Permissions (All Objects)
|
||||
#### Задать разрешения по умолчанию (для всех объектов)
|
||||
|
||||
First, configure the baseline permissions that apply to **all objects** by default:
|
||||
Сначала настройте базовые разрешения, которые по умолчанию применяются ко **всем объектам**:
|
||||
|
||||
| Permission | Описание |
|
||||
| ------------------------------------------- | -------------------------------------- |
|
||||
| **Просмотр записей на всех объектах** | View records in lists and detail pages |
|
||||
| **Редактирование записей на всех объектах** | Modify existing records |
|
||||
| **Удаление записей на всех объектах** | Soft-delete records (can be restored) |
|
||||
| **Уничтожение записей на всех объектах** | Permanently delete records |
|
||||
| Разрешение | Описание |
|
||||
| ------------------------------------------- | --------------------------------------------------------------------- |
|
||||
| **Просмотр записей на всех объектах** | Просматривать записи в списках и на страницах с подробной информацией |
|
||||
| **Редактирование записей на всех объектах** | Изменять существующие записи |
|
||||
| **Удаление записей на всех объектах** | Мягко удалять записи (их можно восстановить) |
|
||||
| **Уничтожение записей на всех объектах** | Безвозвратно удалять записи |
|
||||
|
||||
Select or unselect based on what should be the default behavior for this role.
|
||||
Включайте или отключайте в зависимости от того, каким должно быть поведение по умолчанию для этой роли.
|
||||
|
||||
<Note>
|
||||
**Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
|
||||
**Пример — роль стажёра**: По умолчанию стажёр должен видеть все объекты, но не редактировать их. Включите "Просмотр записей для всех объектов", но оставьте "Редактирование записей для всех объектов" не отмеченным.
|
||||
</Note>
|
||||
|
||||
#### Add Object-Level Exceptions
|
||||
#### Добавить исключения на уровне объекта
|
||||
|
||||
After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
|
||||
После настройки значений по умолчанию используйте подраздел **На уровне объекта**, чтобы добавить правила, которые переопределяют значения по умолчанию для конкретных объектов.
|
||||
|
||||
Click **+ Add rule** and select an object to create an exception.
|
||||
Нажмите **+ Добавить правило** и выберите объект, чтобы создать исключение.
|
||||
|
||||
**Example rules for an Intern role:**
|
||||
**Примеры правил для роли стажёра:**
|
||||
|
||||
| Rule | Effect |
|
||||
| ------------------------------------- | ------------------------------------------------------ |
|
||||
| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
|
||||
| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
|
||||
| Правило | Результат |
|
||||
| -------------------------------------------- | ---------------------------------------------------------------- |
|
||||
| Opportunities → отключить "Просмотр записей" | Стажёр вообще не видит объект Opportunities |
|
||||
| People → включить "Редактирование записей" | Стажёр может редактировать записи People (но не других объектов) |
|
||||
|
||||
### Field Permissions
|
||||
### Разрешения на уровне поля
|
||||
|
||||
Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
|
||||
В рамках каждого правила на уровне объекта вы можете дополнительно настроить **разрешения на уровне поля**, чтобы управлять доступом к конкретным полям.
|
||||
|
||||
| Permission | Описание |
|
||||
| -------------- | -------------------------- |
|
||||
| **See Field** | View the field value |
|
||||
| **Edit Field** | Modify the field value |
|
||||
| **No Access** | Field is completely hidden |
|
||||
| Разрешение | Описание |
|
||||
| ----------------------- | --------------------------- |
|
||||
| **Просмотр поля** | Просматривать значение поля |
|
||||
| **Редактирование поля** | Изменять значение поля |
|
||||
| **Нет доступа** | Поле полностью скрыто |
|
||||
|
||||
**Example — Restrict sensitive fields:**
|
||||
**Пример — ограничение доступа к конфиденциальным полям:**
|
||||
|
||||
For the Intern role with People edit access, you might want to restrict certain fields:
|
||||
Для роли стажёра с правом редактирования People вы можете ограничить некоторые поля:
|
||||
|
||||
* People → Email → **See Field** only (cannot edit)
|
||||
* People → Address → **No Access** (completely hidden)
|
||||
* People → Email → только **Просмотр поля** (редактирование недоступно)
|
||||
* People → Address → **Нет доступа** (полностью скрыто)
|
||||
|
||||
This allows the intern to edit most People fields while protecting sensitive information.
|
||||
Это позволяет стажёру редактировать большинство полей People, при этом защищая конфиденциальную информацию.
|
||||
|
||||
### How Permission Inheritance Works
|
||||
### Как работает наследование разрешений
|
||||
|
||||
Permissions cascade from general to specific:
|
||||
Разрешения применяются каскадно — от общих к конкретным:
|
||||
|
||||
1. **All Objects** → sets the baseline for all objects
|
||||
2. **Object-Level rules** → override the baseline for specific objects
|
||||
3. **Field-Level rules** → override the object setting for specific fields
|
||||
1. **Все объекты** → задаёт базовый уровень для всех объектов
|
||||
2. **Правила на уровне объекта** → переопределяют базовые настройки для конкретных объектов
|
||||
3. **Правила на уровне поля** → переопределяют настройки объекта для конкретных полей
|
||||
|
||||
More specific settings always take precedence.
|
||||
Более конкретные настройки всегда имеют приоритет.
|
||||
|
||||
### Управление переопределениями разрешений
|
||||
|
||||
To override inherited permissions:
|
||||
Чтобы переопределить унаследованные разрешения:
|
||||
|
||||
1. Нажмите **X**, чтобы удалить унаследованное правило
|
||||
2. Select the specific permissions you want
|
||||
2. Выберите нужные конкретные разрешения
|
||||
3. Нажмите оранжевую **Отмена** (круглая стрелка), чтобы отменить изменения
|
||||
|
||||
Когда закончите, нажмите **Завершить**, затем **Сохранить**, после чего вас перенаправит на страницу роли.
|
||||
@@ -146,7 +146,7 @@ To override inherited permissions:
|
||||
* Или включите специальные разрешения (например, генерация API-ключей, предпочтения рабочего пространства, назначение ролей, настройка модели данных, настройки безопасности и управление Workflows)
|
||||
|
||||
<Note>
|
||||
**Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
|
||||
**Текущее ограничение**: Для ручного запуска рабочих процессов в настоящее время требуется доступ к управлению рабочими процессами. Это поведение может измениться в будущих версиях.
|
||||
</Note>
|
||||
|
||||
### Разрешения на действия в рабочем пространстве
|
||||
@@ -156,43 +156,43 @@ To override inherited permissions:
|
||||
* Переключатель **Все доступ к приложениям** для предоставления полных разрешений
|
||||
* Или включите индивидуальные действия, такие как **Отправить email**, **Импортировать CSV** и **Экспортировать CSV**
|
||||
|
||||
## Assigning Roles to API Keys and AI Agents
|
||||
## Назначение ролей ключам API и AI-агентам
|
||||
|
||||
Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
|
||||
Помимо участников рабочего пространства, роли также можно назначать **ключам API** и **AI-агентам**. Это особенно полезно для команд, которые хотят точно контролировать, «кто» что может делать в их рабочем пространстве — включая автоматизированные процессы и интеграции.
|
||||
|
||||
### Why Assign Roles to API Keys and AI Agents?
|
||||
### Зачем назначать роли ключам API и AI-агентам?
|
||||
|
||||
* **Security**: Limit what automated processes can access or modify
|
||||
* **Compliance**: Ensure integrations only touch the data they need
|
||||
* **Control**: Prevent accidental data changes from misconfigured automations
|
||||
* **Auditability**: Track which actions were performed by which integration or agent
|
||||
* **Безопасность**: Ограничьте доступ и возможность изменений для автоматизированных процессов
|
||||
* **Соответствие требованиям**: Обеспечьте, чтобы интеграции получали доступ только к необходимым данным
|
||||
* **Контроль**: Предотвратите случайные изменения данных из-за неверно настроенных автоматизаций
|
||||
* **Аудит**: Отслеживайте, какие действия выполнены какой интеграцией или каким агентом
|
||||
|
||||
### Assign a Role to an API Key
|
||||
### Назначить роль ключу API
|
||||
|
||||
1. Перейдите в **Настройки → Роли**
|
||||
2. Нажмите на роль, которую вы хотите назначить
|
||||
3. Откройте вкладку **Назначение**
|
||||
4. Under **API Keys**, click **+ Assign to API key**
|
||||
5. Select the API key from the list
|
||||
4. В разделе **Ключи API** нажмите **+ Назначить ключу API**
|
||||
5. Выберите ключ API из списка
|
||||
6. Подтвердите назначение
|
||||
|
||||
The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
|
||||
Теперь ключ API унаследует все разрешения, определённые этой ролью. Любые вызовы API, выполненные с этим ключом, будут соответствующим образом ограничены.
|
||||
|
||||
<Note>
|
||||
API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
|
||||
Ключи API без назначенной роли используют разрешения по умолчанию. Для повышения безопасности всегда назначайте конкретную роль производственным ключам API.
|
||||
</Note>
|
||||
|
||||
### Assign a Role to an AI Agent
|
||||
### Назначить роль AI-агенту
|
||||
|
||||
1. Перейдите в **Настройки → Роли**
|
||||
2. Нажмите на роль, которую вы хотите назначить
|
||||
3. Откройте вкладку **Назначение**
|
||||
4. Under **AI Agents**, click **+ Assign to AI agent**
|
||||
5. Select the AI agent from the list
|
||||
4. В разделе **AI-агенты** нажмите **+ Назначить AI-агенту**
|
||||
5. Выберите AI-агента из списка
|
||||
6. Подтвердите назначение
|
||||
|
||||
The AI agent will only be able to access data and perform actions allowed by its assigned role.
|
||||
AI-агент сможет получать доступ к данным и выполнять действия только в пределах разрешений назначенной ему роли.
|
||||
|
||||
<Note>
|
||||
For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
|
||||
Для AI-агентов, работающих в рамках рабочих процессов, это гарантирует, что агент не сможет получать доступ к данным или изменять их вне своей предназначенной области — даже если у рабочего процесса есть более широкие разрешения.
|
||||
</Note>
|
||||
|
||||
+71
-71
@@ -1,125 +1,125 @@
|
||||
---
|
||||
title: SSO Configuration
|
||||
description: Configure Single Sign-On for secure enterprise authentication.
|
||||
title: Конфигурация SSO
|
||||
description: Настройте единый вход (SSO) для безопасной корпоративной аутентификации.
|
||||
---
|
||||
|
||||
## About SSO
|
||||
## О SSO
|
||||
|
||||
Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
|
||||
Единый вход (SSO) позволяет участникам вашей команды входить в Twenty, используя провайдера идентификации вашей организации. Это обеспечивает:
|
||||
|
||||
* **Centralized access control**: Manage access from one place
|
||||
* **Enhanced security**: Leverage your existing security policies
|
||||
* **Better user experience**: One set of credentials for all tools
|
||||
* **Централизованное управление доступом**: управляйте доступом из одного места
|
||||
* **Повышенная безопасность**: используйте существующие политики безопасности
|
||||
* **Лучший пользовательский опыт**: один набор учетных данных для всех инструментов
|
||||
|
||||
## Supported Providers
|
||||
## Поддерживаемые провайдеры
|
||||
|
||||
Twenty supports SSO with:
|
||||
Twenty поддерживает SSO с:
|
||||
|
||||
* **SAML 2.0**: Works with most enterprise identity providers
|
||||
* **Google Workspace**: For organizations using Google
|
||||
* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
|
||||
* **SAML 2.0**: работает с большинством корпоративных провайдеров идентификации
|
||||
* **Google Workspace**: для организаций, использующих Google
|
||||
* **Microsoft Entra ID**: (ранее Azure AD) для сред Microsoft
|
||||
|
||||
## Setting Up SSO
|
||||
## Настройка SSO
|
||||
|
||||
### Требования
|
||||
|
||||
* Organization plan (cloud and self-hosted workspaces)
|
||||
* Admin access to your identity provider
|
||||
* Admin access to Twenty workspace
|
||||
* План Organization (облачные и самостоятельно размещённые рабочие пространства)
|
||||
* Доступ администратора к вашему провайдеру идентификации
|
||||
* Доступ администратора к рабочему пространству Twenty
|
||||
|
||||
<Note>
|
||||
**For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
|
||||
**Для пользователей с самостоятельным размещением, желающих настроить SSO**, свяжитесь по адресу contact@twenty.com
|
||||
</Note>
|
||||
|
||||
### Configuration Steps
|
||||
### Шаги настройки
|
||||
|
||||
#### 1. Access SSO Settings
|
||||
#### 1. Доступ к настройкам SSO
|
||||
|
||||
1. Go to **Settings → Security**
|
||||
2. Find the **SSO Configuration** section
|
||||
3. Click **Configure SSO**
|
||||
1. Перейдите в **Настройки → Безопасность**
|
||||
2. Найдите раздел **Конфигурация SSO**
|
||||
3. Нажмите **Настроить SSO**
|
||||
|
||||
#### 2) Choose Your Provider
|
||||
#### 2) Выберите своего провайдера
|
||||
|
||||
Select your identity provider from the list or choose "Custom SAML" for other providers.
|
||||
Выберите вашего провайдера идентификации из списка или выберите "Custom SAML" для других провайдеров.
|
||||
|
||||
#### 3. Configure Your Identity Provider
|
||||
#### 3. Настройте вашего провайдера идентификации
|
||||
|
||||
You'll need to configure your identity provider with:
|
||||
Вам потребуется настроить вашего провайдера идентификации со следующими параметрами:
|
||||
|
||||
* **Entity ID**: Provided by Twenty
|
||||
* **ACS URL**: The callback URL for authentication
|
||||
* **Certificate**: For secure communication
|
||||
* **Entity ID**: предоставляется Twenty
|
||||
* **ACS URL**: URL обратного вызова для аутентификации
|
||||
* **Сертификат**: для защищённой связи
|
||||
|
||||
#### 4. Enter Provider Details in Twenty
|
||||
#### 4. Введите данные провайдера в Twenty
|
||||
|
||||
* **SSO URL**: Login URL from your provider
|
||||
* **Entity ID**: Your provider's identifier
|
||||
* **Certificate**: X.509 certificate from your provider
|
||||
* **SSO URL**: URL для входа от вашего провайдера
|
||||
* **Entity ID**: идентификатор вашего провайдера
|
||||
* **Сертификат**: сертификат X.509 от вашего провайдера
|
||||
|
||||
#### 5. Test and Enable
|
||||
#### 5. Проверка и включение
|
||||
|
||||
1. Click **Test Configuration** to verify setup
|
||||
2. Enable SSO when testing is successful
|
||||
3. Configure user provisioning preferences
|
||||
1. Нажмите **Проверить конфигурацию**, чтобы проверить настройку
|
||||
2. Включите SSO, когда проверка пройдёт успешно
|
||||
3. Настройте параметры подготовки пользователей
|
||||
|
||||
## User Provisioning
|
||||
## Подготовка пользователей
|
||||
|
||||
### Just-in-Time (JIT) Provisioning
|
||||
### Подготовка Just-in-Time (JIT)
|
||||
|
||||
* Users are created automatically on first login
|
||||
* Assigned default role automatically
|
||||
* No manual user creation needed
|
||||
* Пользователи создаются автоматически при первом входе
|
||||
* Им автоматически назначается роль по умолчанию
|
||||
* Ручное создание пользователей не требуется
|
||||
|
||||
### Manual Provisioning
|
||||
### Ручная подготовка
|
||||
|
||||
* Invite users before they can log in
|
||||
* Pre-assign specific roles
|
||||
* More control over who can access
|
||||
* Пригласите пользователей до того, как они смогут войти
|
||||
* Предварительно назначьте конкретные роли
|
||||
* Больше контроля над тем, кто имеет доступ
|
||||
|
||||
## Managing SSO Users
|
||||
## Управление пользователями SSO
|
||||
|
||||
### Role Assignment
|
||||
### Назначение ролей
|
||||
|
||||
SSO users can be assigned roles like regular users:
|
||||
Пользователям SSO можно назначать роли так же, как обычным пользователям:
|
||||
|
||||
1. Go to **Settings → Members**
|
||||
2. Find the user
|
||||
3. Change their role as needed
|
||||
1. Перейдите в **Настройки → Участники**
|
||||
2. Найдите пользователя
|
||||
3. Измените их роль при необходимости
|
||||
|
||||
### Access Revocation
|
||||
### Отзыв доступа
|
||||
|
||||
To remove access for SSO users:
|
||||
Чтобы удалить доступ для пользователей SSO:
|
||||
|
||||
* Remove them from your identity provider, or
|
||||
* Remove them from the Twenty workspace
|
||||
* Удалите их из вашего провайдера идентификации или
|
||||
* Удалите их из рабочего пространства Twenty
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### Безопасность
|
||||
|
||||
* **Require SSO**: Disable password login for SSO users
|
||||
* **Regular audits**: Review access periodically
|
||||
* **Strong IdP policies**: Enforce MFA at the identity provider
|
||||
* **Требовать SSO**: отключите вход по паролю для пользователей SSO
|
||||
* **Регулярные аудиты**: периодически пересматривайте доступ
|
||||
* **Строгие политики IdP**: обеспечьте MFA на стороне провайдера идентификации
|
||||
|
||||
### User Management
|
||||
### Управление пользователями
|
||||
|
||||
* **Clear naming**: Use consistent naming from your directory
|
||||
* **Group mapping**: Map IdP groups to Twenty roles (if available)
|
||||
* **Offboarding process**: Include Twenty in your deprovisioning workflow
|
||||
* **Понятные названия**: используйте единообразные наименования из вашего каталога
|
||||
* **Сопоставление групп**: сопоставьте группы IdP с ролями Twenty (если доступно)
|
||||
* **Процесс офбординга**: включите Twenty в ваш рабочий процесс отзыва доступов
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
### Common Issues
|
||||
### Распространённые проблемы
|
||||
|
||||
* **Certificate errors**: Ensure certificate hasn't expired
|
||||
* **URL mismatches**: Verify ACS URL matches exactly
|
||||
* **User not found**: Check JIT provisioning settings
|
||||
* **Ошибки сертификата**: убедитесь, что срок действия сертификата не истёк
|
||||
* **Несоответствия URL**: убедитесь, что ACS URL совпадает в точности
|
||||
* **Пользователь не найден**: проверьте настройки JIT-подготовки
|
||||
|
||||
### Получение помощи
|
||||
|
||||
If you encounter issues, contact support with:
|
||||
Если вы столкнётесь с проблемами, обратитесь в поддержку, указав:
|
||||
|
||||
* Error messages received
|
||||
* Identity provider being used
|
||||
* Configuration details (without sensitive data)
|
||||
* Полученные сообщения об ошибках
|
||||
* Используемый провайдер идентификации
|
||||
* Подробности конфигурации (без конфиденциальных данных)
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
---
|
||||
title: Domain Settings
|
||||
description: Configure workspace domain, approved access domains, and public domains.
|
||||
title: Настройки доменов
|
||||
description: Настройте домен рабочего пространства, утверждённые домены доступа и публичные домены.
|
||||
---
|
||||
|
||||
Configure domain settings under **Settings → Domains**.
|
||||
Настройте параметры доменов в **Настройки → Домены**.
|
||||
|
||||
## Домен рабочей области
|
||||
|
||||
Edit your subdomain name or set a custom domain for your workspace.
|
||||
Измените имя своего субдомена или установите собственный домен для вашего рабочего пространства.
|
||||
|
||||
### Настроить домен
|
||||
|
||||
1. Click **Customize Domain**
|
||||
2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
|
||||
3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
|
||||
1. Нажмите **Настроить домен**
|
||||
2. Измените свой субдомен (например, `yourcompany.twenty.com`)
|
||||
3. Или настройте собственный домен (например, `crm.yourcompany.com`)
|
||||
|
||||
For custom domains, you'll need to configure DNS settings with your domain provider.
|
||||
Для собственных доменов вам потребуется настроить параметры DNS у вашего провайдера домена.
|
||||
|
||||
## Утвержденные домены
|
||||
|
||||
Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
|
||||
Любой пользователь с адресом электронной почты в этих доменах может автоматически зарегистрироваться в этом рабочем пространстве.
|
||||
|
||||
### Добавить утвержденный домен доступа
|
||||
|
||||
1. Click **Add Approved Access Domain**
|
||||
2. Enter your company domain (e.g., `yourcompany.com`)
|
||||
1. Нажмите **Добавить утверждённый домен доступа**
|
||||
2. Введите домен вашей компании (например, `yourcompany.com`)
|
||||
3. Сохранить
|
||||
|
||||
Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
|
||||
После настройки любой пользователь с адресом электронной почты в этом домене сможет присоединиться к вашему рабочему пространству без прямого приглашения.
|
||||
|
||||
<Note>
|
||||
This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
|
||||
Это удобно: вся ваша команда сможет самостоятельно зарегистрироваться, при этом рабочее пространство останется доступным только для вашей организации.
|
||||
</Note>
|
||||
|
||||
## Публичные домены
|
||||
|
||||
Подготовьте полную и безопасную хостинг-среду на этих доменах.
|
||||
|
||||
### Add Public Domain
|
||||
### Добавить публичный домен
|
||||
|
||||
1. Click **Add Public Domain**
|
||||
2. Enter the domain you want to use
|
||||
3. Configure DNS settings as instructed
|
||||
4. Verify the domain
|
||||
1. Нажмите **Добавить публичный домен**
|
||||
2. Введите домен, который вы хотите использовать
|
||||
3. Настройте параметры DNS согласно инструкциям
|
||||
4. Подтвердите домен
|
||||
|
||||
SSL certificates are automatically provisioned for public domains.
|
||||
SSL-сертификаты автоматически выпускаются для публичных доменов.
|
||||
|
||||
@@ -1,87 +1,87 @@
|
||||
---
|
||||
title: Member Management
|
||||
description: Invite team members and manage workspace access.
|
||||
title: Управление участниками
|
||||
description: Пригласите членов команды и управляйте доступом к рабочему пространству.
|
||||
---
|
||||
|
||||
Manage who has access to your workspace under **Settings → Members**.
|
||||
Управляйте тем, кто имеет доступ к вашему рабочему пространству, в разделе **Настройки → Участники**.
|
||||
|
||||
## Invite New Members
|
||||
## Приглашение новых участников
|
||||
|
||||
### Using Email Invitation
|
||||
### Использование приглашения по электронной почте
|
||||
|
||||
1. Go to **Settings → Members**
|
||||
2. Click **+ Invite**
|
||||
3. Enter the person's email address
|
||||
4. Select a role for the new member
|
||||
5. Click **Send invite**
|
||||
1. Перейдите в **Настройки → Участники**
|
||||
2. Нажмите **+ Пригласить**
|
||||
3. Введите адрес электронной почты получателя
|
||||
4. Выберите роль для нового участника
|
||||
5. Нажмите **Отправить приглашение**
|
||||
|
||||
The invited person will receive an email with a link to join your workspace.
|
||||
Приглашённый получит письмо со ссылкой для присоединения к вашему рабочему пространству.
|
||||
|
||||
### Using Invite Link
|
||||
### Использование ссылки-приглашения
|
||||
|
||||
1. Go to **Settings → Members**
|
||||
1. Перейдите в **Настройки → Участники**
|
||||
2. Скопируйте ссылку приглашения в рабочее пространство
|
||||
3. Поделитесь ссылкой с новыми участниками команды
|
||||
4. Они получат доступ после регистрации
|
||||
|
||||
## View and Manage Members
|
||||
## Просмотр и управление участниками
|
||||
|
||||
### View All Members
|
||||
### Просмотр всех участников
|
||||
|
||||
Go to **Settings → Members** to see:
|
||||
Перейдите в **Настройки → Участники**, чтобы увидеть:
|
||||
|
||||
* All active members
|
||||
* Pending invitations
|
||||
* Все активные участники
|
||||
* Ожидающие приглашения
|
||||
|
||||
### Edit a Member's Profile
|
||||
### Редактирование профиля участника
|
||||
|
||||
Click on a member to open their profile page. As an admin, you can:
|
||||
Нажмите на участника, чтобы открыть его страницу профиля. Как администратор, вы можете:
|
||||
|
||||
* Edit their **name**
|
||||
* Update their **profile picture**
|
||||
* **Impersonate** their account (useful for troubleshooting)
|
||||
* **Delete** their account
|
||||
* Изменить **имя**
|
||||
* Обновить **фотографию профиля**
|
||||
* **Войти от имени** пользователя (полезно для устранения неполадок)
|
||||
* **Удалить** учётную запись
|
||||
|
||||
### Change a Member's Role
|
||||
### Изменение роли участника
|
||||
|
||||
On the member's profile page:
|
||||
На странице профиля участника:
|
||||
|
||||
1. Open the **Permissions** tab
|
||||
2. View the currently assigned role
|
||||
3. Select a different role from the dropdown
|
||||
4. The change takes effect immediately
|
||||
1. Откройте вкладку **Разрешения**
|
||||
2. Просмотрите текущую назначенную роль
|
||||
3. Выберите другую роль из выпадающего списка
|
||||
4. Изменение вступает в силу немедленно
|
||||
|
||||
→ [Learn more about roles and permissions](/l/ru/user-guide/permissions-access/capabilities/permissions)
|
||||
→ [Подробнее о ролях и разрешениях](/l/ru/user-guide/permissions-access/capabilities/permissions)
|
||||
|
||||
### Remove a Member
|
||||
### Удаление участника
|
||||
|
||||
1. Click on the member to open their profile
|
||||
2. Click **Delete** to remove them from the workspace
|
||||
1. Нажмите на участника, чтобы открыть его профиль
|
||||
2. Нажмите **Удалить**, чтобы удалить участника из рабочего пространства
|
||||
|
||||
<Warning>
|
||||
Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
|
||||
Удалённые участники сразу теряют доступ. Их данные (записи, заметки, задачи) остаются в рабочем пространстве.
|
||||
</Warning>
|
||||
|
||||
<Warning>
|
||||
**Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
|
||||
**Синхронизация электронной почты также отключается.** Если удалённый пользователь был единственным, кто синхронизировал определённые письма, эти письма будут безвозвратно удалены из рабочего пространства.
|
||||
</Warning>
|
||||
|
||||
## Pending Invitations
|
||||
## Ожидающие приглашения
|
||||
|
||||
Manage invitations that haven't been accepted:
|
||||
Управляйте приглашениями, которые ещё не приняты:
|
||||
|
||||
* **Resend**: Send the invitation email again
|
||||
* **Cancel**: Revoke the invitation before it's accepted
|
||||
* **Отправить снова**: отправить письмо-приглашение ещё раз
|
||||
* **Отменить**: отозвать приглашение до его принятия
|
||||
|
||||
## Одобренные домены доступа
|
||||
|
||||
Allow team members to join automatically based on their email domain:
|
||||
Разрешите участникам команды присоединяться автоматически на основе домена их электронной почты:
|
||||
|
||||
1. Перейдите в **Настройки → Домены**
|
||||
2. Add your company domain (e.g., `yourcompany.com`)
|
||||
3. Anyone with that email domain can join without an invitation
|
||||
2. Добавьте домен вашей компании (например, `yourcompany.com`)
|
||||
3. Любой с таким доменом электронной почты сможет присоединиться без приглашения
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Permissions](/l/ru/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
|
||||
* [Domains Settings](/l/ru/user-guide/settings/capabilities/domains-settings) — configure approved domains
|
||||
* [Разрешения](/l/ru/user-guide/permissions-access/capabilities/permissions) — настройте, что может делать каждая роль
|
||||
* [Настройки доменов](/l/ru/user-guide/settings/capabilities/domains-settings) — настройте список разрешённых доменов
|
||||
|
||||
+50
-50
@@ -1,78 +1,78 @@
|
||||
---
|
||||
title: Filters & Sorting
|
||||
description: Filter and sort records to find exactly what you need.
|
||||
title: Фильтры и сортировка
|
||||
description: Фильтруйте и сортируйте записи, чтобы найти именно то, что вам нужно.
|
||||
---
|
||||
|
||||
## Filtering Data
|
||||
## Фильтрация данных
|
||||
|
||||
Filters help you focus on specific records by showing only those that match your criteria.
|
||||
Фильтры помогают сосредоточиться на конкретных записях, показывая только те, которые соответствуют вашим критериям.
|
||||
|
||||
### Adding a Filter
|
||||
### Добавление фильтра
|
||||
|
||||
1. Click the **Filter** button in the toolbar
|
||||
2. Select the field to filter by
|
||||
3. Choose the operator (equals, contains, etc.)
|
||||
4. Enter the filter value
|
||||
5. Click **Apply**
|
||||
1. Нажмите кнопку **Фильтр** на панели инструментов
|
||||
2. Выберите поле для фильтрации
|
||||
3. Выберите оператор (равно, содержит и т. д.)
|
||||
4. Введите значение фильтра
|
||||
5. Нажмите **Применить**
|
||||
|
||||
### Filter Operators
|
||||
### Операторы фильтра
|
||||
|
||||
| Field Type | Available Operators |
|
||||
| ---------- | -------------------------------------------------- |
|
||||
| Текст | Equals, Contains, Starts with, Ends with, Is empty |
|
||||
| Число | Equals, Greater than, Less than, Between, Is empty |
|
||||
| Дата | Equals, Before, After, Between, Is empty |
|
||||
| Выбрать | Equals, Is any of, Is empty |
|
||||
| Флажок | Is true, Is false |
|
||||
| Связь | Equals, Is empty |
|
||||
| Тип поля | Доступные операторы |
|
||||
| -------- | ------------------------------------------------------ |
|
||||
| Текст | Равно, Содержит, Начинается с, Заканчивается на, Пусто |
|
||||
| Число | Равно, Больше чем, Меньше чем, Между, Пусто |
|
||||
| Дата | Равно, До, После, Между, Пусто |
|
||||
| Выбрать | Равно, Любое из, Пусто |
|
||||
| Флажок | Истинно, Ложно |
|
||||
| Связь | Равно, Пусто |
|
||||
|
||||
### Multiple Filters
|
||||
### Несколько фильтров
|
||||
|
||||
Combine multiple filters to narrow down results:
|
||||
Комбинируйте несколько фильтров, чтобы сузить результаты:
|
||||
|
||||
* All filters are applied with AND logic
|
||||
* Each additional filter further restricts results
|
||||
* Все фильтры применяются с логикой И
|
||||
* Каждый дополнительный фильтр ещё больше сужает результаты
|
||||
|
||||
### Removing Filters
|
||||
### Удаление фильтров
|
||||
|
||||
* Click the **X** on individual filter chips
|
||||
* Click **Clear all** to remove all filters
|
||||
* Нажмите **X** на отдельных чипах фильтров
|
||||
* Нажмите **Очистить всё**, чтобы удалить все фильтры
|
||||
|
||||
## Sorting Data
|
||||
## Сортировка данных
|
||||
|
||||
Sorting determines the order records appear.
|
||||
Сортировка определяет порядок отображения записей.
|
||||
|
||||
### Adding a Sort
|
||||
### Добавление сортировки
|
||||
|
||||
1. Click the **Sort** button in the toolbar
|
||||
2. Select the field to sort by
|
||||
3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
|
||||
4. Click **Apply**
|
||||
1. Нажмите кнопку **Сортировка** на панели инструментов
|
||||
2. Выберите поле для сортировки
|
||||
3. Выберите по возрастанию (A–Z, 0–9) или по убыванию (Z–A, 9–0)
|
||||
4. Нажмите **Применить**
|
||||
|
||||
### Multiple Sorts
|
||||
### Несколько сортировок
|
||||
|
||||
Add multiple sort levels:
|
||||
Добавьте несколько уровней сортировки:
|
||||
|
||||
* First sort is primary
|
||||
* Subsequent sorts apply within groups of equal values
|
||||
* Первая сортировка — основная
|
||||
* Последующие сортировки применяются внутри групп равных значений
|
||||
|
||||
### Quick Column Sorting
|
||||
### Быстрая сортировка столбцов
|
||||
|
||||
Click any column header to sort:
|
||||
Нажмите заголовок любого столбца, чтобы отсортировать:
|
||||
|
||||
* First click: Ascending
|
||||
* Second click: Descending
|
||||
* Third click: Remove sort
|
||||
* Первое нажатие: по возрастанию
|
||||
* Второе нажатие: по убыванию
|
||||
* Третье нажатие: убрать сортировку
|
||||
|
||||
## Saving Filter and Sort Settings
|
||||
## Сохранение настроек фильтров и сортировки
|
||||
|
||||
Filters and sorts are saved with the view:
|
||||
Фильтры и сортировки сохраняются вместе с представлением:
|
||||
|
||||
1. Configure your filters and sorts
|
||||
2. Click **Save** to update the current view
|
||||
3. Or click **Save as new view** to create a variant
|
||||
1. Настройте фильтры и сортировки
|
||||
2. Нажмите **Сохранить**, чтобы обновить текущее представление
|
||||
3. Или нажмите **Сохранить как новое представление**, чтобы создать вариант
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Table Views](/l/ru/user-guide/views-pipelines/capabilities/table-views) — group by feature
|
||||
* [Views Overview](/l/ru/user-guide/views-pipelines/overview) — building and managing views
|
||||
* [Табличные представления](/l/ru/user-guide/views-pipelines/capabilities/table-views) — функция группировки
|
||||
* [Обзор представлений](/l/ru/user-guide/views-pipelines/overview) — создание и управление представлениями
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
---
|
||||
title: Table Views
|
||||
description: Display your data in a spreadsheet-like list format.
|
||||
title: Табличные представления
|
||||
description: Отображайте данные в списке, подобном электронной таблице.
|
||||
---
|
||||
|
||||
## About Table Views
|
||||
## О табличных представлениях
|
||||
|
||||
Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
|
||||
Табличные представления отображают записи в строках с настраиваемыми столбцами — как в электронной таблице. Это тип представления по умолчанию для большинства объектов.
|
||||
|
||||
<img src="/images/user-guide/table-views/table-view.png" style={{width:'100%'}} />
|
||||
|
||||
## Features
|
||||
## Возможности
|
||||
|
||||
### Column Configuration
|
||||
### Настройка столбцов
|
||||
|
||||
* Show or hide columns (fields)
|
||||
* Resize column widths
|
||||
* Reorder columns by dragging
|
||||
* Показывайте или скрывайте столбцы (поля)
|
||||
* Изменяйте ширину столбцов
|
||||
* Меняйте порядок столбцов перетаскиванием
|
||||
|
||||
### Group By a Select Field
|
||||
### Группировка по полю выбора
|
||||
|
||||
Organize records into collapsible groups based on a field of select type.
|
||||
Организуйте записи в сворачиваемые группы по значению поля выбора.
|
||||
|
||||
<img src="/images/user-guide/table-views/table-group-by.png" style={{width:'100%'}} />
|
||||
|
||||
1. Click **Options**
|
||||
2. Select **Group**
|
||||
3. Choose a Select field
|
||||
4. Configure group order under **Options → Group → Sort**:
|
||||
* **Alphabetical** or **Reverse alphabetical**
|
||||
* **Manual order**: Drag groups under "Visible groups" to reorder
|
||||
* Click the **eye icon** next to a group to hide it
|
||||
1. Нажмите **Параметры**
|
||||
2. Выберите **Группировка**
|
||||
3. Выберите поле выбора
|
||||
4. Настройте порядок групп в **Параметры → Группировка → Сортировка**:
|
||||
* **По алфавиту** или **В обратном алфавитном порядке**
|
||||
* **Вручную**: Перетащите группы в разделе "Видимые группы", чтобы изменить порядок
|
||||
* Нажмите **значок глаза** рядом с группой, чтобы скрыть её
|
||||
|
||||
**Сценарии использования:**
|
||||
|
||||
* Group Company by Type
|
||||
* Group Opportunities by Stage
|
||||
* Group Tasks by Status
|
||||
* Сгруппируйте компании по типу
|
||||
* Сгруппируйте сделки по этапам
|
||||
* Сгруппируйте задачи по статусу
|
||||
|
||||
<Note>
|
||||
**For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
|
||||
**Для лучшей производительности ограничьте количество видимых групп до 10–15 в одном представлении.** Если нужно больше групп, рассмотрите возможность использования вместо этого панели мониторинга.
|
||||
</Note>
|
||||
|
||||
### Column Widths
|
||||
### Ширина столбцов
|
||||
|
||||
Resize columns to show more or less content:
|
||||
Изменяйте размер столбцов, чтобы показывать больше или меньше содержимого:
|
||||
|
||||
1. Hover between two column headers
|
||||
2. Click and drag the column border
|
||||
3. Release to set the new width
|
||||
1. Наведите курсор между двумя заголовками столбцов
|
||||
2. Щёлкните и перетащите границу столбца
|
||||
3. Отпустите, чтобы установить новую ширину
|
||||
|
||||
## When to Use Table Views
|
||||
## Когда использовать табличные представления
|
||||
|
||||
Table views work best for:
|
||||
Табличные представления лучше всего подходят для:
|
||||
|
||||
* **Browsing large datasets** — scan many records quickly
|
||||
* **Data entry** — edit multiple records efficiently
|
||||
* **Detailed analysis** — see many fields at once
|
||||
* **Sorting and filtering** — find specific records
|
||||
* **Просмотра больших наборов данных** — быстро просматривать множество записей
|
||||
* **Ввода данных** — эффективно редактировать несколько записей
|
||||
* **Детального анализа** — видеть множество полей одновременно
|
||||
* **Сортировки и фильтрации** — находить конкретные записи
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Fields and Columns](/l/ru/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
|
||||
* [Filters and Sorting](/l/ru/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
|
||||
* [Поля и столбцы](/l/ru/user-guide/views-pipelines/capabilities/fields-and-columns) — настройка отображаемых полей
|
||||
* [Фильтры и сортировка](/l/ru/user-guide/views-pipelines/capabilities/filters-and-sorting) — сужение списка записей
|
||||
|
||||
+43
-43
@@ -1,80 +1,80 @@
|
||||
---
|
||||
title: Create a Kanban View for Projects
|
||||
description: Track projects through stages using a visual board.
|
||||
title: Создайте канбан-представление для проектов
|
||||
description: Отслеживайте проекты по стадиям с помощью визуальной доски.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
|
||||
Используйте канбан-представление, чтобы визуализировать ваши проекты (или любой объект со стадиями) в виде карточек, перемещающихся между столбцами.
|
||||
|
||||
<VimeoEmbed videoId="927888627" title="Видеодемонстрация" />
|
||||
|
||||
## Требования
|
||||
|
||||
Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
|
||||
Вашему объекту нужно **поле Select**, которое будет использоваться в качестве столбцов (например, Статус, Стадия, Этап).
|
||||
|
||||
If you don't have one:
|
||||
Если его нет:
|
||||
|
||||
1. Go to **Settings → Data Model**
|
||||
2. Select your object
|
||||
3. Add a Select field with your stage options
|
||||
1. Перейдите в **Настройки → Модель данных**
|
||||
2. Выберите ваш объект
|
||||
3. Добавьте поле Select с вариантами стадий
|
||||
|
||||
## Steps
|
||||
## Шаги
|
||||
|
||||
1. Navigate to your object (e.g., Projects, Tasks)
|
||||
2. Click the view dropdown → **+ Add view**
|
||||
3. Name your view (e.g., "Project Board")
|
||||
4. Click **Create**
|
||||
5. Click **Options** and select **Kanban** as the layout
|
||||
6. The view uses your Select field for columns automatically
|
||||
1. Перейдите к вашему объекту (например, Проекты, Задачи)
|
||||
2. Откройте выпадающее меню представления → **+ Добавить представление**
|
||||
3. Назовите представление (например, "Доска проекта")
|
||||
4. Нажмите **Создать**
|
||||
5. Нажмите **Параметры** и выберите **Kanban** в качестве макета
|
||||
6. Представление автоматически использует ваше поле Select в качестве столбцов
|
||||
7. Нажмите **Сохранить**
|
||||
|
||||
## Configure Your Board
|
||||
## Настройка вашей доски
|
||||
|
||||
### Show Key Fields on Cards
|
||||
### Отображение ключевых полей на карточках
|
||||
|
||||
1. Click **Options → Fields**
|
||||
2. Find fields in the "Hidden Fields" section
|
||||
3. Click the **eye icon** to display them on cards
|
||||
4. Drag to reorder
|
||||
1. Нажмите **Параметры → Поля**
|
||||
2. Найдите поля в разделе «Скрытые поля»
|
||||
3. Нажмите **значок глаза**, чтобы отобразить их на карточках
|
||||
4. Перетащите, чтобы изменить порядок
|
||||
|
||||
<img src="/images/user-guide/kanban-views/filter.png" style={{width:'100%'}} />
|
||||
|
||||
### Enable Compact View
|
||||
### Включение компактного вида
|
||||
|
||||
For a high-level overview:
|
||||
Для общего обзора:
|
||||
|
||||
1. Click **Options**
|
||||
2. Turn on **Compact view**
|
||||
1. Нажмите **Параметры**
|
||||
2. Включите **Компактный вид**
|
||||
|
||||
Cards show only the record name.
|
||||
Карточки показывают только название записи.
|
||||
|
||||
<img src="/images/user-guide/kanban-views/compact-view.png" style={{width:'100%'}} />
|
||||
|
||||
### Add Aggregations
|
||||
### Добавление агрегаций
|
||||
|
||||
Show counts or totals at the top of each column:
|
||||
Показывайте количество или итоги вверху каждого столбца:
|
||||
|
||||
1. Click the number next to a column name
|
||||
2. Select an aggregation (Count, Sum, etc.)
|
||||
3. Choose a field if needed
|
||||
1. Нажмите на число рядом с названием столбца
|
||||
2. Выберите агрегацию (Count, Sum и т. д.)
|
||||
3. Выберите поле, если нужно
|
||||
|
||||
## Moving Cards
|
||||
## Перемещение карточек
|
||||
|
||||
Drag and drop cards between columns to update their status.
|
||||
Перетаскивайте карточки между столбцами, чтобы обновить их статус.
|
||||
|
||||
<VimeoEmbed videoId="927888627" title="Видеодемонстрация" />
|
||||
|
||||
## Example: Task Board
|
||||
## Пример: доска задач
|
||||
|
||||
| Column (Status) | Cards |
|
||||
| --------------- | ----------------- |
|
||||
| **To Do** | New tasks |
|
||||
| **In Progress** | Active work |
|
||||
| **Review** | Awaiting approval |
|
||||
| **Done** | Завершено |
|
||||
| Столбец (статус) | Карточки |
|
||||
| ---------------- | ------------------- |
|
||||
| **К выполнению** | Новые задачи |
|
||||
| **В процессе** | Активная работа |
|
||||
| **Проверка** | Ожидает утверждения |
|
||||
| **Готово** | Завершено |
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Kanban Views](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
|
||||
* [How to Set Up a Sales Pipeline](/l/ru/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
|
||||
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации, компактный вид, стадии
|
||||
* [Как настроить воронку продаж](/l/ru/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Канбан для возможностей
|
||||
|
||||
@@ -1,88 +1,88 @@
|
||||
---
|
||||
title: Use Iterator
|
||||
description: Loop through arrays of records to perform actions on each item.
|
||||
title: Использование итератора
|
||||
description: Перебирайте массивы записей и выполняйте действия для каждого элемента.
|
||||
image: /images/user-guide/workflows/workflow.png
|
||||
---
|
||||
|
||||
Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
|
||||
Итератор позволяет перебирать массив записей и выполнять действия для каждой из них. Он необходим для рабочих процессов, которым нужно обрабатывать несколько записей, возвращённых действием Search Records или полученных через вебхуки.
|
||||
|
||||
## When to Use Iterator
|
||||
## Когда использовать итератор
|
||||
|
||||
| Scenario | Пример |
|
||||
| -------------------------- | ---------------------------------------------- |
|
||||
| **Process search results** | Send email to each person found |
|
||||
| **Handle webhook arrays** | Create records for each item in order |
|
||||
| **Bulk updates** | Update multiple records with calculated values |
|
||||
| **Notifications** | Alert multiple people about an event |
|
||||
| Сценарий | Пример |
|
||||
| -------------------------------- | ----------------------------------------------------- |
|
||||
| **Обработка результатов поиска** | Отправить письмо каждому найденному человеку |
|
||||
| **Обработка массивов вебхуков** | Создать записи для каждого элемента по порядку |
|
||||
| **Массовые обновления** | Обновить несколько записей с рассчитанными значениями |
|
||||
| **Уведомления** | Оповестить нескольких людей о событии |
|
||||
|
||||
## Understanding Iterator
|
||||
## Понимание итератора
|
||||
|
||||
Iterator expects an **array** as input. It then:
|
||||
Итератор ожидает на входе **массив**. Затем он:
|
||||
|
||||
1. Takes the first item from the array
|
||||
2. Runs all actions inside the iterator with that item
|
||||
3. Moves to the next item
|
||||
4. Repeats until all items are processed
|
||||
1. Берёт первый элемент массива
|
||||
2. Выполняет все действия внутри итератора с этим элементом
|
||||
3. Переходит к следующему элементу
|
||||
4. Повторяет, пока все элементы не будут обработаны
|
||||
|
||||
## Basic Setup
|
||||
## Базовая настройка
|
||||
|
||||
### Example: Email Everyone in Search Results
|
||||
### Пример: отправка письма всем из результатов поиска
|
||||
|
||||
**Goal**: Find all contacts in a specific company and send each one a personalized email.
|
||||
**Цель**: найти всех контактов в определённой компании и отправить каждому персонализированное письмо.
|
||||
|
||||
### Step 1: Search for Records
|
||||
### Шаг 1: Поиск записей
|
||||
|
||||
1. Add **Search Records** action
|
||||
2. Object: **People**
|
||||
3. Filter: Company equals "Acme Inc"
|
||||
4. This returns an array of people
|
||||
1. Добавьте действие **Search Records**
|
||||
2. Объект: **Люди**
|
||||
3. Фильтр: Company равно "Acme Inc"
|
||||
4. Это возвращает массив людей
|
||||
|
||||
### Step 2: Check Results Exist
|
||||
### Шаг 2: Проверка наличия результатов
|
||||
|
||||
1. Add **Filter** action
|
||||
2. Condition: `{{searchRecords.length}}` is greater than 0
|
||||
3. This prevents Iterator errors on empty results
|
||||
1. Добавьте действие **Фильтр**
|
||||
2. Условие: `{{searchRecords.length}}` больше 0
|
||||
3. Это предотвращает ошибки итератора при пустых результатах
|
||||
|
||||
### Step 3: Add Iterator
|
||||
### Шаг 3: Добавьте итератор
|
||||
|
||||
1. Add **Iterator** action
|
||||
2. Array input: Select `{{searchRecords}}`
|
||||
3. This creates a loop
|
||||
1. Добавьте действие **Iterator**
|
||||
2. Входной массив: выберите `{{searchRecords}}`
|
||||
3. Это создаёт цикл
|
||||
|
||||
### Step 4: Add Actions Inside Iterator
|
||||
### Шаг 4: Добавьте действия внутри итератора
|
||||
|
||||
Actions placed after Iterator run for each item:
|
||||
Действия, добавленные после итератора, выполняются для каждого элемента:
|
||||
|
||||
1. Add **Send Email** action (inside iterator)
|
||||
2. To: `{{iterator.currentItem.email}}`
|
||||
3. Subject: Hello `{{iterator.currentItem.firstName}}`!
|
||||
4. Body: Personalized message using current item fields
|
||||
1. Добавьте действие **Send Email** (внутри итератора)
|
||||
2. Кому: `{{iterator.currentItem.email}}`
|
||||
3. Тема: Привет, `{{iterator.currentItem.firstName}}`!
|
||||
4. Текст письма: персонализированное сообщение с использованием полей текущего элемента
|
||||
|
||||
### Результат
|
||||
|
||||
If Search Records returns 5 people, the Iterator:
|
||||
Если Search Records возвращает 5 человек, то итератор:
|
||||
|
||||
* Sends email to person 1
|
||||
* Sends email to person 2
|
||||
* ... continues for all 5
|
||||
* Отправляет письмо первому человеку
|
||||
* Отправляет письмо второму человеку
|
||||
* ... и так для всех 5
|
||||
|
||||
## Accessing Current Item Data
|
||||
## Доступ к данным текущего элемента
|
||||
|
||||
Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
|
||||
Внутри итератора используйте `{{iterator.currentItem}}`, чтобы обратиться к текущей записи:
|
||||
|
||||
| Variable | Описание |
|
||||
| --------------------------------------- | ----------------------------------- |
|
||||
| `{{iterator.currentItem}}` | The entire current record object |
|
||||
| `{{iterator.currentItem.id}}` | Record ID |
|
||||
| `{{iterator.currentItem.email}}` | Email field |
|
||||
| `{{iterator.currentItem.company.name}}` | Related company name |
|
||||
| `{{iterator.index}}` | Current position in array (0-based) |
|
||||
| Переменная | Описание |
|
||||
| --------------------------------------- | ---------------------------------- |
|
||||
| `{{iterator.currentItem}}` | Весь объект текущей записи |
|
||||
| `{{iterator.currentItem.id}}` | ID записи |
|
||||
| `{{iterator.currentItem.email}}` | Поле электронной почты |
|
||||
| `{{iterator.currentItem.company.name}}` | Название связанной компании |
|
||||
| `{{iterator.index}}` | Текущая позиция в массиве (с нуля) |
|
||||
|
||||
## Common Patterns
|
||||
## Типовые шаблоны
|
||||
|
||||
### Update Multiple Records
|
||||
### Обновление нескольких записей
|
||||
|
||||
**Goal**: Mark all overdue tasks as "Late"
|
||||
**Цель**: пометить все просроченные задачи как "Late"
|
||||
|
||||
```
|
||||
1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
|
||||
@@ -94,9 +94,9 @@ Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
|
||||
- Status: Late
|
||||
```
|
||||
|
||||
### Create Records from Array
|
||||
### Создание записей из массива
|
||||
|
||||
**Goal**: Webhook receives order with multiple items, create a record for each
|
||||
**Цель**: вебхук получает заказ с несколькими позициями; создайте запись для каждой
|
||||
|
||||
```
|
||||
1. Webhook Trigger (receives items array)
|
||||
@@ -109,9 +109,9 @@ Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
|
||||
- Related Order: {{trigger.body.orderId}}
|
||||
```
|
||||
|
||||
### Conditional Processing Inside Loop
|
||||
### Условная обработка внутри цикла
|
||||
|
||||
**Goal**: Only send email to contacts with valid emails
|
||||
**Цель**: отправлять письма только контактам с действительными адресами электронной почты
|
||||
|
||||
```
|
||||
1. Search Records (People)
|
||||
@@ -125,52 +125,52 @@ Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
|
||||
|
||||
### "Iterator expects an array"
|
||||
|
||||
**Cause**: You passed a single record instead of an array.
|
||||
**Причина**: вы передали одну запись вместо массива.
|
||||
|
||||
**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
|
||||
**Решение**: убедитесь, что вы передаёте результат действия Search Records или поле-массив, а не одну запись.
|
||||
|
||||
```
|
||||
✅ Correct: {{searchRecords}}
|
||||
❌ Wrong: {{searchRecords[0]}}
|
||||
```
|
||||
|
||||
### Iterator Doesn't Run
|
||||
### Итератор не запускается
|
||||
|
||||
**Cause**: The array is empty.
|
||||
**Причина**: массив пуст.
|
||||
|
||||
**Fix**: Add a Filter before Iterator to check array length:
|
||||
**Решение**: добавьте фильтр перед итератором, чтобы проверить длину массива:
|
||||
|
||||
```
|
||||
Filter: {{searchRecords.length}} > 0
|
||||
```
|
||||
|
||||
### Actions Run Too Many Times
|
||||
### Действия выполняются слишком много раз
|
||||
|
||||
**Cause**: Search Records returned more records than expected.
|
||||
**Причина**: действие Search Records вернуло больше записей, чем ожидалось.
|
||||
|
||||
**Fix**:
|
||||
**Решение**:
|
||||
|
||||
* Add more specific filters to Search Records
|
||||
* Set a limit on Search Records (max 200)
|
||||
* Add Filter inside Iterator for additional conditions
|
||||
* Добавьте более точные фильтры в Search Records
|
||||
* Установите ограничение в Search Records (макс. 200)
|
||||
* Добавьте фильтр внутри итератора для дополнительных условий
|
||||
|
||||
## Performance Considerations
|
||||
## Особенности производительности
|
||||
|
||||
* **Credit usage**: Each iteration consumes credits for its actions
|
||||
* **Time**: Large arrays take longer to process
|
||||
* **Limits**: Consider batching very large operations
|
||||
* **Rate limits**: External API calls may hit rate limits with many iterations
|
||||
* **Расход кредитов**: каждая итерация потребляет кредиты на свои действия
|
||||
* **Время**: обработка больших массивов занимает больше времени
|
||||
* **Ограничения**: рассмотрите пакетную обработку очень больших операций
|
||||
* **Лимиты скорости**: при большом числе итераций внешние вызовы API могут упираться в лимиты скорости
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
1. **Always check array length** before Iterator to avoid errors
|
||||
2. **Add filters inside loops** when not all items need processing
|
||||
3. **Rename your Iterator step** to describe what it's looping through
|
||||
4. **Test with small arrays** before processing large datasets
|
||||
5. **Monitor workflow runs** to ensure iterations complete as expected
|
||||
1. **Всегда проверяйте длину массива** перед итератором, чтобы избежать ошибок
|
||||
2. **Добавляйте фильтры внутри циклов**, если обрабатывать нужно не все элементы
|
||||
3. **Переименуйте шаг Iterator**, чтобы он описывал, что именно перебирается
|
||||
4. **Тестируйте на небольших массивах** перед обработкой больших наборов данных
|
||||
5. Отслеживайте выполнения рабочих процессов, чтобы убедиться, что итерации завершаются как ожидается
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Workflow Actions](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
* [How to Use Branches](/l/ru/user-guide/workflows/capabilities/use-branches-in-workflows)
|
||||
* [Workflows FAQ](/l/ru/user-guide/workflows/how-tos/need-more-help/workflows-faq)
|
||||
* [Действия рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
* [Как использовать ветвления](/l/ru/user-guide/workflows/capabilities/use-branches-in-workflows)
|
||||
* [Частые вопросы о рабочих процессах](/l/ru/user-guide/workflows/how-tos/need-more-help/workflows-faq)
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
---
|
||||
title: Workflow Credits
|
||||
description: Understand workflow credit consumption and management.
|
||||
title: Кредиты рабочих процессов
|
||||
description: Разберитесь с потреблением и управлением кредитами рабочих процессов.
|
||||
---
|
||||
|
||||
Workflow credits power your automations in Twenty. Понимание принципов их работы помогает оптимизировать затраты и эффективно управлять бюджетом автоматизации.
|
||||
Кредиты рабочих процессов обеспечивают работу ваших автоматизаций в Twenty. Понимание принципов их работы помогает оптимизировать затраты и эффективно управлять бюджетом автоматизации.
|
||||
|
||||
## Credit Allocation
|
||||
## Распределение кредитов
|
||||
|
||||
Workflow credits are allocated based on your billing cycle, not your plan tier:
|
||||
Кредиты рабочих процессов начисляются по вашему платёжному циклу, а не по уровню плана:
|
||||
|
||||
| Billing Cycle | Credits |
|
||||
| ------------------------ | --------------------------- |
|
||||
| **Monthly subscription** | 5 million credits per month |
|
||||
| **Yearly subscription** | 50 million credits per year |
|
||||
| Платёжный цикл | Кредиты |
|
||||
| ------------------------ | ---------------------------- |
|
||||
| **Ежемесячная подписка** | 5 миллионов кредитов в месяц |
|
||||
| **Годовая подписка** | 50 миллионов кредитов в год |
|
||||
|
||||
<Note>
|
||||
5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
|
||||
5 миллионов кредитов в месяц — щедрый лимит для стандартных автоматизаций. Большинство команд не превысят этот лимит при типичном использовании рабочих процессов. Дополнительные кредиты в основном нужны для продвинутых действий Code и рабочих процессов на базе ИИ.
|
||||
</Note>
|
||||
|
||||
## How Credit Consumption Works
|
||||
## Как работает потребление кредитов
|
||||
|
||||
Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
|
||||
Кредиты расходуются при выполнении рабочих процессов, а не при их создании. Каждое действие рабочего процесса потребляет кредиты в зависимости от своей сложности:
|
||||
|
||||
### Потребление кредитов по типу действия
|
||||
|
||||
* **Основные внутренние операции**: Очень низкое потребление кредитов
|
||||
* Поиск записей
|
||||
* Create Record
|
||||
* Создать запись
|
||||
* Обновление записи
|
||||
* Удаление записи
|
||||
* Действия с формой
|
||||
@@ -35,18 +35,18 @@ Credits are consumed when workflows execute, not when you create them. Each work
|
||||
* Действия с кодом (выполнение JavaScript)
|
||||
* HTTP-запросы к внешним сервисам
|
||||
|
||||
* **AI features**: Higher credit consumption
|
||||
* AI Agent actions consume credits based on the AI model used
|
||||
* More complex prompts and longer outputs use more credits
|
||||
* **Функции ИИ**: Более высокое потребление кредитов
|
||||
* Действия ИИ-агента потребляют кредиты в зависимости от используемой модели ИИ
|
||||
* Более сложные запросы и более длинные ответы расходуют больше кредитов
|
||||
|
||||
* **Delay actions**: Minimal credit consumption
|
||||
* The Delay node consumes **1 credit** when it executes
|
||||
* **No credits are consumed** during the wait period
|
||||
* A 5-minute delay costs the same as a 5-day delay
|
||||
* **Действия Delay**: Минимальное потребление кредитов
|
||||
* Узел Delay потребляет **1 кредит** при выполнении
|
||||
* **Во время ожидания кредиты не потребляются**
|
||||
* Задержка на 5 минут стоит столько же, сколько задержка на 5 дней
|
||||
|
||||
### Списание в реальном времени
|
||||
|
||||
Credits are deducted in real-time as workflows execute. Это означает, что:
|
||||
Кредиты списываются в режиме реального времени при выполнении рабочих процессов. Это означает, что:
|
||||
|
||||
* Черновые рабочие процессы не потребляют кредиты
|
||||
* Только активные, выполняемые рабочие процессы используют ваш кредитный лимит
|
||||
@@ -71,6 +71,6 @@ Credits are deducted in real-time as workflows execute. Это означает,
|
||||
## Лучшие практики
|
||||
|
||||
* **Пакетная обработка**: Используйте массовые операции и действия с Итератором эффективно
|
||||
* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
|
||||
* **Оптимизация ручного запуска**: Для ручных триггеров выберите вариант `Bulk`, чтобы обработать несколько записей за один запуск рабочего процесса
|
||||
* Оптимизируйте действия с кодом для повышения эффективности
|
||||
* Пакетные операции для снижения числа отдельных вызовов действий
|
||||
|
||||
+38
-38
@@ -1,27 +1,27 @@
|
||||
---
|
||||
title: Bring Typeform Submissions into Twenty
|
||||
description: Handle Typeform's webhook payload to create leads from form submissions.
|
||||
title: Импорт ответов Typeform в Twenty
|
||||
description: Обработайте полезную нагрузку вебхука Typeform, чтобы создавать лиды из отправок формы.
|
||||
---
|
||||
|
||||
For standard webhook setup, see [Set Up a Webhook Trigger](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
|
||||
Для стандартной настройки вебхука см. [Настройка триггера вебхука](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). В этой статье рассматривается специальная обработка, требуемая для пользовательской структуры полезной нагрузки Typeform.
|
||||
|
||||
### Step 1: Create a Webhook Workflow
|
||||
### Шаг 1: Создайте рабочий процесс с вебхуком
|
||||
|
||||
1. Go to **Settings → Workflows**
|
||||
2. Click **+ New Workflow**
|
||||
3. Select **Webhook** as the trigger
|
||||
4. Copy the webhook URL
|
||||
1. Перейдите в **Настройки → Рабочие процессы**
|
||||
2. Нажмите **+ Новый рабочий процесс**
|
||||
3. Выберите **Webhook** в качестве триггера
|
||||
4. Скопируйте URL вебхука
|
||||
|
||||
### Step 2: Configure Typeform
|
||||
### Шаг 2: Настройте Typeform
|
||||
|
||||
1. In Typeform, open your form
|
||||
2. Go to **Connect → Webhooks**
|
||||
3. Paste your Twenty webhook URL
|
||||
1. В Typeform откройте свою форму
|
||||
2. Перейдите в **Connect → Webhooks**
|
||||
3. Вставьте URL вебхука Twenty
|
||||
4. Сохранить
|
||||
|
||||
### Step 3: Understand the Typeform Payload
|
||||
### Шаг 3: Разберитесь в полезной нагрузке Typeform
|
||||
|
||||
Typeform sends a nested JSON structure. Here's a simplified example:
|
||||
Typeform отправляет вложенную структуру JSON. Вот упрощенный пример:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -60,15 +60,15 @@ Typeform sends a nested JSON structure. Here's a simplified example:
|
||||
}
|
||||
```
|
||||
|
||||
Key things to note:
|
||||
Ключевые моменты:
|
||||
|
||||
* Form data is nested under `form_response`
|
||||
* **Answers are returned as an array**, not as named fields
|
||||
* Each answer includes the field type and title for reference
|
||||
* Данные формы находятся в `form_response`
|
||||
* **Ответы возвращаются в виде массива**, а не именованных полей
|
||||
* Каждый ответ включает тип поля и его заголовок для справки
|
||||
|
||||
### Step 4: Extract Fields from the Answers Array
|
||||
### Шаг 4: Извлеките поля из массива ответов
|
||||
|
||||
Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
|
||||
Поскольку `answers` — это массив, на последующих шагах можно выбрать только весь массив, а не отдельные поля. Добавьте действие **Code** для извлечения нужных полей:
|
||||
|
||||
```javascript
|
||||
export const main = async (params: {
|
||||
@@ -100,31 +100,31 @@ export const main = async (params: {
|
||||
};
|
||||
```
|
||||
|
||||
Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
|
||||
На последующих шагах теперь можно выбирать отдельные поля, такие как `contact.firstName` и `contact.email`, в селекторе переменных.
|
||||
|
||||
<Tip>
|
||||
For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/ru/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
|
||||
Для получения подробностей об обработке массивов в действиях Code см. [Обработка массивов в действиях Code](/l/ru/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
|
||||
</Tip>
|
||||
|
||||
### Step 5: Create the Record
|
||||
### Шаг 5: Создайте запись
|
||||
|
||||
Add a **Create Record** action:
|
||||
Добавьте действие **Создать запись**:
|
||||
|
||||
| Поле | Значение |
|
||||
| -------------- | ---------------------------------------------------- |
|
||||
| **Object** | Люди |
|
||||
| **First Name** | `{{code.contact.firstName}}` |
|
||||
| **Last Name** | `{{code.contact.lastName}}` |
|
||||
| **Email** | `{{code.contact.email}}` |
|
||||
| **Company** | Search or create based on `{{code.contact.company}}` |
|
||||
| Поле | Значение |
|
||||
| --------------------- | --------------------------------------------------------- |
|
||||
| **Объект** | Люди |
|
||||
| **Имя** | `{{code.contact.firstName}}` |
|
||||
| **Фамилия** | `{{code.contact.lastName}}` |
|
||||
| **Электронная почта** | `{{code.contact.email}}` |
|
||||
| **Компания** | Найдите или создайте на основе `{{code.contact.company}}` |
|
||||
|
||||
### Step 6: Test and Activate
|
||||
### Шаг 6: Протестируйте и активируйте
|
||||
|
||||
1. Submit a test response in Typeform
|
||||
2. Check the workflow run to verify data was captured
|
||||
3. Activate the workflow
|
||||
1. Отправьте тестовый ответ в Typeform
|
||||
2. Проверьте запуск рабочего процесса, чтобы убедиться, что данные были получены
|
||||
3. Активируйте рабочий процесс
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Set Up a Webhook Trigger](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
|
||||
* [Handle Arrays in Code Actions](/l/ru/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
|
||||
* [Настройка триггера вебхука](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
|
||||
* [Обработка массивов в действиях Code](/l/ru/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
|
||||
|
||||
+88
-88
@@ -1,130 +1,130 @@
|
||||
---
|
||||
title: Display Related Record Data
|
||||
description: Show data from related records (e.g., Company info on Opportunities) using workflows.
|
||||
title: Отображение данных связанных записей
|
||||
description: Показывайте данные из связанных записей (например, информацию о компании в сделках) с помощью рабочих процессов.
|
||||
---
|
||||
|
||||
Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
|
||||
Отображайте данные из связанных записей прямо в ваших записях — например, показывайте численность сотрудников из компании в её сделках. Этот обходной путь с рабочим процессом полезен, пока вложенные поля не поддерживаются нативно.
|
||||
|
||||
## Типичные случаи использования
|
||||
|
||||
| Источник | Destination | Fields to Copy |
|
||||
| ----------- | ----------- | ------------------------------- |
|
||||
| Компания | Возможность | Industry, Company Size, ARR |
|
||||
| Person | Возможность | Email, Phone, Title |
|
||||
| Возможность | Компания | Last Deal Amount, Last Won Date |
|
||||
| Источник | Назначение | Поля для копирования |
|
||||
| ----------- | ----------- | -------------------------------------------------------- |
|
||||
| Компания | Возможность | Отрасль, размер компании, ARR |
|
||||
| Контакт | Возможность | Email, телефон, должность |
|
||||
| Возможность | Компания | Сумма последней сделки, дата последней выигранной сделки |
|
||||
|
||||
## Basic Field Copy
|
||||
## Базовое копирование полей
|
||||
|
||||
### Example: Copy Contact Email to Opportunity
|
||||
### Пример: копирование Email контакта в сделку
|
||||
|
||||
**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
|
||||
**Цель**: При указании контактного лица в сделке скопируйте его email в сделку для быстрого доступа.
|
||||
|
||||
### Prerequisite
|
||||
### Предварительное условие
|
||||
|
||||
Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
|
||||
Создайте целевые поля в **Settings → Data Model → Opportunities** перед созданием рабочего процесса:
|
||||
|
||||
* Contact Email (type: Email)
|
||||
* Contact Phone (type: Phone)
|
||||
* Email контакта (тип: Email)
|
||||
* Телефон контакта (тип: Phone)
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
|
||||
1. **Триггер**: Запись обновлена (Сделки, поле Контактное лицо)
|
||||
|
||||
2. **Filter**: Check that Point of Contact is not empty
|
||||
2. **Фильтр**: Проверьте, что поле Контактное лицо не пустое
|
||||
|
||||
3. **Search Records**: Find the linked person
|
||||
* Object: People
|
||||
* Filter: ID equals `{{trigger.object.pointOfContact.id}}`
|
||||
3. **Поиск записей**: найдите связанного контакта
|
||||
* Объект: Контакты
|
||||
* Фильтр: ID равен `{{trigger.object.pointOfContact.id}}`
|
||||
|
||||
4. **Update Record**:
|
||||
* Object: Opportunities
|
||||
* Record: `{{trigger.object.id}}`
|
||||
* Contact Email: `{{searchRecords[0].email}}`
|
||||
* Contact Phone: `{{searchRecords[0].phone}}`
|
||||
4. **Обновление записи**:
|
||||
* Объект: Сделки
|
||||
* Запись: `{{trigger.object.id}}`
|
||||
* Email контакта: `{{searchRecords[0].email}}`
|
||||
* Телефон контакта: `{{searchRecords[0].phone}}`
|
||||
|
||||
## Copy Multiple Fields
|
||||
## Копирование нескольких полей
|
||||
|
||||
### Example: Sync Company Info to All Related Opportunities
|
||||
### Пример: синхронизация данных компании со всеми связанными сделками
|
||||
|
||||
**Goal**: When company details change, update all related opportunities.
|
||||
**Цель**: Когда данные компании меняются, обновляйте все связанные сделки.
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated (Companies)
|
||||
* Fields: Industry, Company Size, Annual Revenue
|
||||
1. **Триггер**: Запись обновлена (Компании)
|
||||
* Поля: отрасль, размер компании, годовой доход
|
||||
|
||||
2. **Search Records**: Find all opportunities for this company
|
||||
* Object: Opportunities
|
||||
* Filter: Company ID equals `{{trigger.object.id}}`
|
||||
2. **Поиск записей**: найдите все сделки для этой компании
|
||||
* Объект: Сделки
|
||||
* Фильтр: ID компании равен `{{trigger.object.id}}`
|
||||
|
||||
3. **Iterator**: Loop through each opportunity
|
||||
3. **Итератор**: цикл по каждой сделке
|
||||
|
||||
4. **Update Record** (inside iterator):
|
||||
* Object: Opportunities
|
||||
* Record: `{{iterator.currentItem.id}}`
|
||||
* Company Industry: `{{trigger.object.industry}}`
|
||||
* Company Size: `{{trigger.object.companySize}}`
|
||||
* Company ARR: `{{trigger.object.annualRevenue}}`
|
||||
4. **Обновление записи** (внутри итератора):
|
||||
* Объект: Сделки
|
||||
* Запись: `{{iterator.currentItem.id}}`
|
||||
* Отрасль компании: `{{trigger.object.industry}}`
|
||||
* Размер компании: `{{trigger.object.companySize}}`
|
||||
* ARR компании: `{{trigger.object.annualRevenue}}`
|
||||
|
||||
## Copy on Record Creation
|
||||
## Копирование при создании записи
|
||||
|
||||
### Example: Pre-fill Opportunity with Company Data
|
||||
### Пример: предзаполнение сделки данными компании
|
||||
|
||||
**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
|
||||
**Цель**: При создании сделки, связанной с компанией, автоматически копируйте ключевую информацию о компании.
|
||||
|
||||
### Prerequisite
|
||||
### Предварительное условие
|
||||
|
||||
Create the destination fields in **Settings → Data Model → Opportunities**:
|
||||
Создайте целевые поля в **Settings → Data Model → Opportunities**:
|
||||
|
||||
* Company Industry (type: Text)
|
||||
* Company Size (type: Number)
|
||||
* Отрасль компании (тип: Text)
|
||||
* Размер компании (тип: Number)
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Created (Opportunities)
|
||||
* Filter: Company is not empty
|
||||
1. **Триггер**: Запись создана (Сделки)
|
||||
* Фильтр: поле Компания не пустое
|
||||
|
||||
2. **Search Records**: Get the linked company's details
|
||||
* Object: Companies
|
||||
* Filter: ID equals `{{trigger.object.company.id}}`
|
||||
2. **Поиск записей**: получите сведения о связанной компании
|
||||
* Объект: Компании
|
||||
* Фильтр: ID равен `{{trigger.object.company.id}}`
|
||||
|
||||
3. **Update Record**:
|
||||
* Object: Opportunities
|
||||
* Record: `{{trigger.object.id}}`
|
||||
* Company Industry: `{{searchRecords[0].industry}}`
|
||||
* Company Size: `{{searchRecords[0].employees}}`
|
||||
3. **Обновление записи**:
|
||||
* Объект: Сделки
|
||||
* Запись: `{{trigger.object.id}}`
|
||||
* Отрасль компании: `{{searchRecords[0].industry}}`
|
||||
* Размер компании: `{{searchRecords[0].employees}}`
|
||||
|
||||
<Note>
|
||||
**Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/ru/developers/extend/capabilities/apis) instead.
|
||||
**Ограничение для задач и заметок**: связи в задачах и заметках жёстко заданы как многие-ко-многим и пока недоступны в триггерах или действиях рабочего процесса. Чтобы получить доступ к этим связям, вместо этого используйте [API](/l/ru/developers/extend/capabilities/apis).
|
||||
</Note>
|
||||
|
||||
## Bidirectional Sync
|
||||
## Двунаправленная синхронизация
|
||||
|
||||
### Example: Keep Primary Contact in Sync
|
||||
### Пример: синхронизация основного контакта
|
||||
|
||||
**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
|
||||
**Цель**: Когда в компании меняется основной контакт, обновляйте контакт. Когда контакт становится основным, обновляйте компанию.
|
||||
|
||||
### Workflow 1: Company → Person
|
||||
### Рабочий процесс 1: Компания → Контакт
|
||||
|
||||
1. **Trigger**: Record is Updated (Companies, Primary Contact field)
|
||||
2. **Update Record**: Set person's "Is Primary Contact" to true
|
||||
3. **Search Records**: Find previous primary contact
|
||||
4. **Update Record**: Set previous contact's "Is Primary Contact" to false
|
||||
1. **Триггер**: Запись обновлена (Компании, поле Основной контакт)
|
||||
2. **Обновление записи**: установите у контакта "Is Primary Contact" в значение true
|
||||
3. **Поиск записей**: найдите предыдущего основного контакта
|
||||
4. **Обновление записи**: установите у предыдущего контакта "Is Primary Contact" в значение false
|
||||
|
||||
### Workflow 2: Person → Company
|
||||
### Рабочий процесс 2: Контакт → Компания
|
||||
|
||||
1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
|
||||
2. **Update Record**: Set company's Primary Contact to this person
|
||||
1. **Триггер**: Запись обновлена (Контакты, Is Primary Contact = true)
|
||||
2. **Обновление записи**: установите у компании поле Primary Contact на этого контакта
|
||||
|
||||
<Note>
|
||||
Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
|
||||
Осторожнее с двунаправленными синхронизациями, чтобы избежать бесконечных циклов. Используйте фильтры, чтобы проверять, действительно ли значение изменилось, прежде чем обновлять.
|
||||
</Note>
|
||||
|
||||
## Using Code for Complex Mapping
|
||||
## Использование кода для сложного сопоставления
|
||||
|
||||
### Example: Transform Data During Copy
|
||||
### Пример: преобразование данных при копировании
|
||||
|
||||
**Goal**: Copy and format phone number from person to opportunity.
|
||||
**Цель**: Скопировать и отформатировать номер телефона из контакта в сделку.
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -146,25 +146,25 @@ export const main = async (params) => {
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### Avoid Loops
|
||||
### Избегайте циклов
|
||||
|
||||
* Don't create workflows that trigger each other endlessly
|
||||
* Use specific field conditions
|
||||
* Add checks to see if value actually changed
|
||||
* Не создавайте рабочие процессы, которые бесконечно запускают друг друга
|
||||
* Используйте конкретные условия для полей
|
||||
* Добавляйте проверки, что значение действительно изменилось
|
||||
|
||||
### Handle Missing Data
|
||||
### Обработка отсутствующих данных
|
||||
|
||||
* Always check if source record exists before copying
|
||||
* Provide default values for optional fields
|
||||
* Use filters to skip when source field is empty
|
||||
* Всегда проверяйте, что исходная запись существует, перед копированием
|
||||
* Задавайте значения по умолчанию для необязательных полей
|
||||
* Используйте фильтры, чтобы пропускать случаи, когда исходное поле пусто
|
||||
|
||||
### Performance
|
||||
### Производительность
|
||||
|
||||
* Batch updates when copying to many records
|
||||
* Use scheduled workflows for bulk sync operations
|
||||
* Consider using Iterator for multiple record updates
|
||||
* Выполняйте пакетные обновления при копировании во множество записей
|
||||
* Используйте запланированные рабочие процессы для массовых операций синхронизации
|
||||
* Рассмотрите использование Итератора для обновления множества записей
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [Workflow Actions](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
* [Workflow Triggers](/l/ru/user-guide/workflows/capabilities/workflow-triggers)
|
||||
* [Действия рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
* [Триггеры рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-triggers)
|
||||
|
||||
+60
-60
@@ -1,37 +1,37 @@
|
||||
---
|
||||
title: Formula Fields
|
||||
description: Create formula fields using workflows until native support is available.
|
||||
title: Формульные поля
|
||||
description: Создавайте формульные поля с помощью рабочих процессов, пока не появится встроенная поддержка.
|
||||
---
|
||||
|
||||
Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
|
||||
В Twenty пока нет собственной поддержки формульных полей (планируется в 2026), но того же результата можно добиться с помощью рабочих процессов. Это обходное решение позволяет автоматически вычислять и заполнять значения полей — от простых конкатенаций до сложной бизнес-логики.
|
||||
|
||||
## Типичные случаи использования
|
||||
|
||||
| Use Case | Formula Example |
|
||||
| ------------------- | --------------------------------- |
|
||||
| **Full name** | First Name + " " + Last Name |
|
||||
| **Expected amount** | Amount × Probability |
|
||||
| **Days until due** | Due Date - Today |
|
||||
| **Days in stage** | Today - Stage Entry Date |
|
||||
| **Lead score** | Points based on multiple criteria |
|
||||
| Сценарий использования | Пример формулы |
|
||||
| ---------------------- | ------------------------------------ |
|
||||
| **Полное имя** | Имя + " " + Фамилия |
|
||||
| **Ожидаемая сумма** | Сумма × Вероятность |
|
||||
| **Дней до срока** | Срок - Сегодня |
|
||||
| **Дней на этапе** | Сегодня - Дата входа в этап |
|
||||
| **Оценка лида** | Баллы на основе нескольких критериев |
|
||||
|
||||
<Tip>
|
||||
For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage).
|
||||
Полный пример отслеживания времени на этапах воронки см. в разделе [Как отслеживать, сколько времени возможности находятся на каждом этапе](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage).
|
||||
</Tip>
|
||||
|
||||
## Basic Formula: Concatenation
|
||||
## Базовая формула: конкатенация
|
||||
|
||||
### Example: Auto-Fill Full Name
|
||||
### Пример: автозаполнение полного имени
|
||||
|
||||
**Goal**: Automatically combine first and last name into a full name field.
|
||||
**Цель**: автоматически объединять имя и фамилию в поле полного имени.
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated or Created (People)
|
||||
1. **Триггер**: запись обновлена или создана (Люди)
|
||||
|
||||
2. **Filter**: Check that first name or last name changed
|
||||
2. **Фильтр**: проверьте, что изменились имя или фамилия
|
||||
|
||||
3. **Code action**:
|
||||
3. **Действие кода**:
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -45,21 +45,21 @@ export const main = async (params) => {
|
||||
};
|
||||
```
|
||||
|
||||
4. **Update Record**: Set Full Name to `{{code.fullName}}`
|
||||
4. **Обновить запись**: установить Полное имя равным `{{code.fullName}}`
|
||||
|
||||
## Numeric Formula: Expected Amount
|
||||
## Числовая формула: ожидаемая сумма
|
||||
|
||||
### Example: Calculate Expected Revenue
|
||||
### Пример: рассчитать ожидаемую выручку
|
||||
|
||||
**Goal**: Multiply opportunity amount by probability to get expected amount.
|
||||
**Цель**: умножить сумму возможности на вероятность, чтобы получить ожидаемую сумму.
|
||||
|
||||
See [How to Show Expected Amount in Pipeline](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
|
||||
Полный рабочий процесс см. в разделе [Как показать ожидаемую сумму в воронке](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline).
|
||||
|
||||
### Quick Setup
|
||||
### Быстрая настройка
|
||||
|
||||
1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
|
||||
1. **Триггер**: запись обновлена (Возможности, поле Сумма ИЛИ Вероятность)
|
||||
|
||||
2. **Code action**:
|
||||
2. **Действие кода**:
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -71,19 +71,19 @@ export const main = async (params) => {
|
||||
};
|
||||
```
|
||||
|
||||
3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
|
||||
3. **Обновить запись**: установить Ожидаемую сумму равной `{{code.expectedAmount}}`
|
||||
|
||||
## Date Formula: Days Calculation
|
||||
## Формула даты: вычисление дней
|
||||
|
||||
### Example: Days Until Task Due
|
||||
### Пример: дни до срока задачи
|
||||
|
||||
**Goal**: Calculate how many days remain until a task's due date.
|
||||
**Цель**: вычислить, сколько дней осталось до срока задачи.
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
|
||||
1. **Триггер**: запись обновлена или создана (Задачи, поле Срок)
|
||||
|
||||
2. **Code action**:
|
||||
2. **Действие кода**:
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -102,23 +102,23 @@ export const main = async (params) => {
|
||||
};
|
||||
```
|
||||
|
||||
3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
|
||||
3. **Обновить запись**: установить поле «Дни до срока» равным `{{code.daysUntilDue}}`
|
||||
|
||||
<Note>
|
||||
Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
|
||||
Отрицательные значения означают просроченные задачи. Это поле можно использовать для фильтрации или сортировки задач по срочности.
|
||||
</Note>
|
||||
|
||||
## Conditional Formula: Lead Score
|
||||
## Условная формула: оценка лида
|
||||
|
||||
### Example: Calculate Lead Score Based on Criteria
|
||||
### Пример: расчет оценки лида на основе критериев
|
||||
|
||||
**Goal**: Score leads based on company size, industry, and engagement.
|
||||
**Цель**: оценивать лидов на основе размера компании, отрасли и вовлеченности.
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated (People or Companies)
|
||||
1. **Триггер**: запись обновлена (Люди или Компании)
|
||||
|
||||
2. **Code action**:
|
||||
2. **Действие кода**:
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -147,19 +147,19 @@ export const main = async (params) => {
|
||||
};
|
||||
```
|
||||
|
||||
3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
|
||||
3. **Обновить запись**: установить Оценку лида равной `{{code.leadScore}}`
|
||||
|
||||
## Text Formula: Domain Extraction
|
||||
## Текстовая формула: извлечение домена
|
||||
|
||||
### Example: Extract Domain from Email
|
||||
### Пример: извлечение домена из email
|
||||
|
||||
**Goal**: Automatically extract and store the email domain.
|
||||
**Цель**: автоматически извлечь и сохранить домен email.
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Trigger**: Record is Updated (People, Email field)
|
||||
1. **Триггер**: запись обновлена (Люди, поле Email)
|
||||
|
||||
2. **Code action**:
|
||||
2. **Действие кода**:
|
||||
|
||||
```javascript
|
||||
export const main = async (params) => {
|
||||
@@ -173,30 +173,30 @@ export const main = async (params) => {
|
||||
};
|
||||
```
|
||||
|
||||
3. **Update Record**: Set Domain field to `{{code.domain}}`
|
||||
3. **Обновить запись**: установить поле Домен равным `{{code.domain}}`
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### Performance
|
||||
### Производительность
|
||||
|
||||
* Only trigger on relevant field changes
|
||||
* Use filters to skip records that don't need calculation
|
||||
* Avoid complex calculations in high-volume workflows
|
||||
* Запускайте только при изменении релевантных полей
|
||||
* Используйте фильтры, чтобы пропускать записи, которым не требуется вычисление
|
||||
* Избегайте сложных вычислений в высоконагруженных рабочих процессах
|
||||
|
||||
### Error Handling
|
||||
### Обработка ошибок
|
||||
|
||||
* Check for null/undefined values before calculations
|
||||
* Use default values when data is missing
|
||||
* Return clear error messages when calculations fail
|
||||
* Проверяйте значения null/undefined перед вычислениями
|
||||
* Используйте значения по умолчанию при отсутствии данных
|
||||
* Возвращайте понятные сообщения об ошибках при сбое вычислений
|
||||
|
||||
### Тестирование
|
||||
|
||||
* Test with edge cases (empty fields, zero values)
|
||||
* Verify calculations manually before activating
|
||||
* Monitor workflow runs for unexpected results
|
||||
* Тестируйте на крайних случаях (пустые поля, нулевые значения)
|
||||
* Проверьте вычисления вручную перед активацией
|
||||
* Отслеживайте выполнения рабочих процессов на предмет неожиданных результатов
|
||||
|
||||
## Related
|
||||
## Связанные материалы
|
||||
|
||||
* [How to Show Expected Amount in Pipeline](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
|
||||
* [How to Track Time in Stage](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage)
|
||||
* [Workflow Actions](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
* [Как показать ожидаемую сумму в воронке](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
|
||||
* [Как отслеживать время на этапе](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage)
|
||||
* [Действия рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-actions)
|
||||
|
||||
+2
-2
@@ -6,10 +6,10 @@ Bu belge, arka uçta çalışırken uymanız gereken en iyi uygulamaları açık
|
||||
|
||||
## Modüler bir yaklaşım izleyin
|
||||
|
||||
The backend follows a modular approach, which is a fundamental principle when working with NestJS. Kodunuzu temiz ve düzenli bir kod tabanı sağlamak için yeniden kullanılabilir modüllere ayırdığınızdan emin olun.
|
||||
Arka uç, NestJS ile çalışırken temel bir ilke olan modüler bir yaklaşımı benimser. Kodunuzu temiz ve düzenli bir kod tabanı sağlamak için yeniden kullanılabilir modüllere ayırdığınızdan emin olun.
|
||||
Her modül belirli bir özellik veya işlevselliği kapsamalı ve iyi tanımlanmış bir kapsama sahip olmalıdır. Bu modüler yaklaşım, sorumlulukların net bir şekilde ayrılmasını sağlar ve gereksiz karmaşıklıkları ortadan kaldırır.
|
||||
|
||||
## Expose services to use in modules
|
||||
## Modüllerde kullanılmak üzere servisleri dışa açın
|
||||
|
||||
Her zaman kod okunabilirliğini ve bakım yapılabilirliğini artıran, net ve tek bir sorumluluğa sahip hizmetler oluşturun. Hizmetlerin adlarını açıklayıcı ve tutarlı bir şekilde adlandırın.
|
||||
|
||||
|
||||
+34
-34
@@ -1,9 +1,9 @@
|
||||
---
|
||||
title: Klasör Mimarisi
|
||||
info: A detailed look into our server folder architecture
|
||||
info: Sunucu klasör mimarimize detaylı bir bakış
|
||||
---
|
||||
|
||||
The backend directory structure is as follows:
|
||||
Arka uç dizin yapısı aşağıdaki gibidir:
|
||||
|
||||
```
|
||||
server
|
||||
@@ -21,37 +21,37 @@ server
|
||||
└───utils
|
||||
```
|
||||
|
||||
## Ability
|
||||
## Yetkiler
|
||||
|
||||
Defines permissions and includes handlers for each entity.
|
||||
İzinleri tanımlar ve her bir varlık için işleyiciler içerir.
|
||||
|
||||
## Decorators
|
||||
## Dekoratörler
|
||||
|
||||
Defines custom decorators in NestJS for added functionality.
|
||||
Ek işlevsellik için NestJS'te özel dekoratörleri tanımlar.
|
||||
|
||||
See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
|
||||
Daha fazla bilgi için [özel dekoratörler](https://docs.nestjs.com/custom-decorators) sayfasına bakın.
|
||||
|
||||
## Filtreler
|
||||
|
||||
Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
|
||||
GraphQL uç noktalarında oluşabilecek istisnaları ele almak için istisna filtreleri içerir.
|
||||
|
||||
## Guards
|
||||
## Guard'lar
|
||||
|
||||
See [guards](https://docs.nestjs.com/guards) for more details.
|
||||
Daha fazla bilgi için [guard'lar](https://docs.nestjs.com/guards) sayfasına bakın.
|
||||
|
||||
## Health
|
||||
## Sağlık
|
||||
|
||||
Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
|
||||
Veritabanının beklendiği gibi çalışıp çalışmadığını doğrulamak için JSON döndüren, herkese açık bir REST API'si (healthz) içerir.
|
||||
|
||||
## Meta Veriler
|
||||
|
||||
Defines custom objects and makes available a GraphQL API (graphql/metadata).
|
||||
Özel nesneleri tanımlar ve bir GraphQL API'sini (graphql/metadata) kullanıma sunar.
|
||||
|
||||
## İş Alanı
|
||||
|
||||
Generates and serves custom GraphQL schema based on the metadata.
|
||||
Meta verilere dayalı özel GraphQL şeması oluşturur ve sunar.
|
||||
|
||||
### Workspace Directory Structure
|
||||
### Çalışma Alanı Dizin Yapısı
|
||||
|
||||
```
|
||||
workspace
|
||||
@@ -83,42 +83,42 @@ workspace
|
||||
└───workspace.factory.ts
|
||||
```
|
||||
|
||||
The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
|
||||
Çalışma alanı dizininin kökünde, `createGraphQLSchema` fonksiyonunu içeren `workspace.factory.ts` dosyası bulunur. Bu fonksiyon, meta verileri kullanarak her bir çalışma alanına özgü bir şema üretir. Şema ve resolver oluşturmayı ayırarak, bu ayrık bileşenleri birleştiren `makeExecutableSchema` fonksiyonunu kullanırız.
|
||||
|
||||
This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
|
||||
Bu strateji sadece düzenle ilgili değildir; aynı zamanda performans ve ölçeklenebilirliği artırmak için oluşturulan tür tanımlarının önbelleğe alınması gibi optimizasyonlara da yardımcı olur.
|
||||
|
||||
### Workspace Schema builder
|
||||
### Çalışma Alanı Şema Oluşturucu
|
||||
|
||||
Generates the GraphQL schema, and includes:
|
||||
GraphQL şemasını oluşturur ve şunları içerir:
|
||||
|
||||
#### Factories:
|
||||
#### Factory'ler:
|
||||
|
||||
Specialised constructors to generate GraphQL-related constructs.
|
||||
GraphQL ile ilgili yapıları oluşturmak için özelleşmiş kurucular.
|
||||
|
||||
* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
|
||||
* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
|
||||
* type.factory, alan meta verilerini `TypeMapperService` kullanarak GraphQL türlerine dönüştürür.
|
||||
* type-definition.factory, `objectMetadata` temel alınarak GraphQL girdi veya çıktı nesneleri oluşturur.
|
||||
|
||||
#### GraphQL Types
|
||||
#### GraphQL Türleri
|
||||
|
||||
Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
|
||||
Numaralandırmalar, girdiler, nesneler ve skalerleri içerir ve şema oluşturmanın yapı taşları olarak hizmet eder.
|
||||
|
||||
#### Interfaces and Object Definitions
|
||||
#### Arayüzler ve Nesne Tanımları
|
||||
|
||||
Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
|
||||
GraphQL varlıkları için şablonları içerir ve `MONEY` veya `URL` gibi hem önceden tanımlı hem de özel türleri kapsar.
|
||||
|
||||
#### Services
|
||||
#### Servisler
|
||||
|
||||
Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
|
||||
FieldMetadataType ile uygun GraphQL skalerini veya sorgu değiştiricilerini ilişkilendirmekten sorumlu servisi içerir.
|
||||
|
||||
#### Storage
|
||||
#### Depolama
|
||||
|
||||
Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
|
||||
Yeniden kullanılabilir tür tanımlarını barındıran ve GraphQL türlerinin yinelenmesini önleyen `TypeDefinitionsStorage` sınıfını içerir.
|
||||
|
||||
### Workspace Resolver Builder
|
||||
### Çalışma Alanı Resolver Oluşturucu
|
||||
|
||||
Creates resolver functions for querying and mutating the GraphQL schema.
|
||||
GraphQL şemasında sorgulama ve mutasyon için resolver fonksiyonları oluşturur.
|
||||
|
||||
Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
|
||||
Bu dizindeki her bir factory, çeşitli tablolar genelinde uyarlanabilir kullanım için tasarlanmış `FindManyResolverFactory` gibi, farklı bir resolver türü üretmekten sorumludur.
|
||||
|
||||
### Çalışma Alanı Sorgu Çalıştırıcı
|
||||
|
||||
|
||||
+4
-4
@@ -5,12 +5,12 @@ title: Backend Komutları
|
||||
## Faydalı Komutlar
|
||||
|
||||
Bu komutlar packages/twenty-server klasöründen çalıştırılmalıdır.
|
||||
From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
|
||||
Diğer herhangi bir klasörden `npx nx {command} twenty-server` (veya `npx nx run twenty-server:{command}`) çalıştırabilirsiniz.
|
||||
|
||||
### İlk Kurulum
|
||||
|
||||
```
|
||||
npx nx database:reset twenty-server # setup the database with dev seeds
|
||||
npx nx database:reset twenty-server # veritabanını geliştirme tohum verileriyle kur
|
||||
```
|
||||
|
||||
### Sunucuyu Başlatma
|
||||
@@ -22,7 +22,7 @@ npx nx run twenty-server:start
|
||||
### Kod Temizleme
|
||||
|
||||
```
|
||||
npx nx run twenty-server:lint # pass --fix to fix lint errors
|
||||
npx nx run twenty-server:lint # lint hatalarını düzeltmek için --fix'i geç
|
||||
```
|
||||
|
||||
### Test
|
||||
@@ -60,7 +60,7 @@ npx nx run twenty-server:command workspace:sync-metadata -f
|
||||
```
|
||||
|
||||
<Warning>
|
||||
This will drop the database and re-run the migrations and seed.
|
||||
Bu işlem veritabanını siler, migrasyonları ve tohumlamayı yeniden çalıştırır.
|
||||
|
||||
Bu komutu çalıştırmadan önce saklamak istediğiniz verileri yedeklediğinizden emin olun.
|
||||
</Warning>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Bugs, Requests & Pull Requests
|
||||
info: Report issues, request features, and contribute code
|
||||
title: Hatalar, İstekler ve Çekme İstekleri
|
||||
info: Sorunları bildirin, özellik talep edin ve koda katkıda bulunun
|
||||
---
|
||||
|
||||
## Hataları Bildirme
|
||||
@@ -13,66 +13,66 @@ Bir hatayı bildirmek için lütfen [GitHub'da bir sorun oluşturun](https://git
|
||||
|
||||
Eğer bunun bir hata olmadığından emin değilseniz ve bir özellik isteğine daha yakın olduğunu düşünüyorsanız, muhtemelen [bunun yerine bir tartışma başlatmalısınız](https://github.com/twentyhq/twenty/discussions/new).
|
||||
|
||||
## Submit a Pull Request
|
||||
## Çekme İsteği Gönderin
|
||||
|
||||
Contributing code to Twenty starts with a pull request (PR).
|
||||
Twenty'ye koda katkıda bulunmak bir çekme isteği (PR) ile başlar.
|
||||
|
||||
### Başlamadan Önce
|
||||
|
||||
1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
|
||||
2. For new features, open an issue first to discuss
|
||||
3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
|
||||
1. İlgili çalışmalar için [mevcut sorunları](https://github.com/twentyhq/twenty/issues) kontrol edin
|
||||
2. Yeni özellikler için, tartışmak üzere önce bir sorun açın
|
||||
3. [Davranış Kuralları](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md) belgemizi inceleyin
|
||||
|
||||
### Fork and Clone
|
||||
### Fork'layın ve Klonlayın
|
||||
|
||||
1. Fork the repository on GitHub
|
||||
2. Clone your fork:
|
||||
1. Depoyu GitHub'da fork'layın
|
||||
2. Fork'unuzu klonlayın:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/twenty.git
|
||||
cd twenty
|
||||
```
|
||||
|
||||
3. Add upstream remote:
|
||||
3. Upstream uzak depoyu ekleyin:
|
||||
|
||||
```bash
|
||||
git remote add upstream https://github.com/twentyhq/twenty.git
|
||||
```
|
||||
|
||||
### Create a Branch
|
||||
### Bir Dal Oluşturun
|
||||
|
||||
```bash
|
||||
git checkout -b feature/your-feature-name
|
||||
```
|
||||
|
||||
Use descriptive branch names:
|
||||
Açıklayıcı dal adları kullanın:
|
||||
|
||||
* `feature/add-export-button`
|
||||
* `fix/login-redirect-issue`
|
||||
* `docs/update-api-guide`
|
||||
|
||||
### Make Your Changes
|
||||
### Değişikliklerinizi Yapın
|
||||
|
||||
1. Write clean, well-documented code
|
||||
2. Follow existing code style
|
||||
3. Add tests for new functionality
|
||||
4. Update documentation if needed
|
||||
1. Temiz, iyi belgelenmiş kod yazın
|
||||
2. Mevcut kod stilini izleyin
|
||||
3. Yeni işlevsellik için testler ekleyin
|
||||
4. Gerektiğinde belgeleri güncelleyin
|
||||
|
||||
### Submit Your PR
|
||||
### PR'nizi Gönderin
|
||||
|
||||
1. Push your branch:
|
||||
1. Dalınızı gönderin:
|
||||
|
||||
```bash
|
||||
git push origin feature/your-feature-name
|
||||
```
|
||||
|
||||
2. Open a PR on GitHub
|
||||
3. Fill in the PR template
|
||||
4. Link related issues
|
||||
2. GitHub'da bir PR açın
|
||||
3. PR şablonunu doldurun
|
||||
4. İlgili sorunları ilişkilendirin
|
||||
|
||||
### PR Checklist
|
||||
### PR Kontrol Listesi
|
||||
|
||||
* [ ] Code follows project style guidelines
|
||||
* [ ] Tests pass locally
|
||||
* [ ] Documentation is updated
|
||||
* [ ] PR description explains the changes
|
||||
* [ ] Kod, proje stil yönergelerine uyuyor
|
||||
* [ ] Testler yerelde geçiyor
|
||||
* [ ] Belgeler güncellendi
|
||||
* [ ] PR açıklaması değişiklikleri açıklar
|
||||
|
||||
+8
-8
@@ -13,7 +13,7 @@ React ve Recoil, kod tabanında durumu yönetir.
|
||||
Durumunuzu depolamak için ihtiyaç duyduğunuz kadar atom oluşturmak iyi bir uygulamadır.
|
||||
|
||||
<Warning>
|
||||
It's better to use extra atoms than trying to be too concise with props drilling.
|
||||
Prop drilling ile gereğinden fazla sade olmaya çalışmaktansa, fazladan atom kullanmak daha iyidir.
|
||||
</Warning>
|
||||
|
||||
```tsx
|
||||
@@ -77,8 +77,8 @@ Kök bileşenize bir `useEffect` eklemeniz gerektiğini hissediyorsanız, bunu b
|
||||
Aynısını Apollo kancaları ile veri çekme mantığı için de uygulayabilirsiniz.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad, will cause re-renders even if data is not changing,
|
||||
// because useEffect needs to be re-evaluated
|
||||
// ❌ Kötü, veri değişmese bile yeniden render'a neden olacak,
|
||||
// çünkü useEffect'in yeniden değerlendirilmesi gerekiyor
|
||||
export const PageComponent = () => {
|
||||
const [data, setData] = useRecoilState(dataState);
|
||||
const [someDependency] = useRecoilState(someDependencyState);
|
||||
@@ -100,8 +100,8 @@ export const App = () => (
|
||||
```
|
||||
|
||||
```tsx
|
||||
// ✅ Good, will not cause re-renders if data is not changing,
|
||||
// because useEffect is re-evaluated in another sibling component
|
||||
// ✅ İyi, veri değişmiyorsa yeniden render'a neden olmaz,
|
||||
// çünkü useEffect başka bir kardeş bileşende yeniden değerlendirilir
|
||||
export const PageComponent = () => {
|
||||
const [data, setData] = useRecoilState(dataState);
|
||||
|
||||
@@ -259,7 +259,7 @@ React bağlamında prop taşıma, durum değişkenlerini ve ayarlayıcılarını
|
||||
|
||||
1. **Azalan Okunabilirlik**: Bir prop'un nereden kaynaklandığını veya nerede kullanıldığını izlemek, derin bir şekilde iç içe geçmiş bir bileşen yapısında karışık hale gelebilir.
|
||||
|
||||
2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
|
||||
2. **Bakım Zorlukları**: Bir bileşenin prop yapısındaki değişiklikler, prop'u doğrudan kullanmasalar bile, birden fazla bileşende ayarlamalar yapılmasını gerektirebilir.
|
||||
|
||||
3. **Azalan Bileşen Yeniden Kullanılabilirliği**: Çok fazla props'u yalnızca aşağıya aktarma amacıyla alan bir bileşen, daha az genel amaçlı hale gelir ve farklı bağlamlarda yeniden kullanılması zorlaşır.
|
||||
|
||||
@@ -269,7 +269,7 @@ Aşırı prop taşıma kullanıyorsanız, [durum yönetimi en iyi uygulamaların
|
||||
|
||||
İçe aktarırken, tüm veya göreli yolları belirtmek yerine belirlenen takma adları tercih edin.
|
||||
|
||||
**The Aliases**
|
||||
**Takma Adlar**
|
||||
|
||||
```js
|
||||
{
|
||||
@@ -319,6 +319,6 @@ const validationSchema = z
|
||||
type Form = z.infer<typeof validationSchema>;
|
||||
```
|
||||
|
||||
## Breaking Changes
|
||||
## Geriye Dönük Uyumsuz Değişiklikler
|
||||
|
||||
Testler henüz kapsamlı bir şekilde entegre edilmediği için, ilerlemeden önce yapılan değişikliklerin başka yerlerde bozulmalara neden olmadığından emin olmak için her zaman kapsamlı manuel testler yapın.
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@ title: Klasör Mimarisi
|
||||
info: Klasör mimarimize detaylı bir bakış
|
||||
---
|
||||
|
||||
In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
|
||||
Bu kılavuzda, proje dizin yapısının ayrıntılarını ve bunun Twenty'nin düzenine ve bakım kolaylığına nasıl katkıda bulunduğunu inceleyeceksiniz.
|
||||
|
||||
Bu klasör mimarisi kuralını izleyerek, belirli özelliklerle ilgili dosyaları bulmak kolaylaşır ve uygulamanın ölçeklenebilir ve bakımı yapılabilir olması sağlanır.
|
||||
|
||||
@@ -24,7 +24,7 @@ front
|
||||
|
||||
## Sayfalar
|
||||
|
||||
Uygulama rotaları tarafından tanımlanan üst düzey bileşenleri içerir. They import more low-level components from the modules folder (more details below).
|
||||
Uygulama rotaları tarafından tanımlanan üst düzey bileşenleri içerir. Bunlar, daha alt düzey bileşenleri modules klasöründen içe aktarırlar (daha fazla ayrıntı aşağıda).
|
||||
|
||||
## Modüller
|
||||
|
||||
|
||||
+21
-22
@@ -8,7 +8,7 @@ Buradaki amaç, okunması ve bakımı kolay tutarlı bir kod tabanı oluşturmak
|
||||
|
||||
Bunun için, biraz daha ayrıntılı olmak, çok kısa olmaktan daha iyidir.
|
||||
|
||||
Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
|
||||
İnsanların kodu yazmaktan daha sık okuduğunu her zaman aklınızda bulundurun; özellikle herkesin katkıda bulunabildiği açık kaynak bir projede.
|
||||
|
||||
Burada tanımlanmayan, ancak linters tarafından otomatik olarak kontrol edilen birçok kural vardır.
|
||||
|
||||
@@ -18,7 +18,7 @@ Burada tanımlanmayan, ancak linters tarafından otomatik olarak kontrol edilen
|
||||
|
||||
Her zaman TSX fonksiyonel bileşenlerini kullanın.
|
||||
|
||||
Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
|
||||
Varsayılan `import`'u `const` ile kullanmayın, çünkü okunması daha zordur ve kod tamamlama ile içe aktarmak daha zordur.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad, harder to read, harder to import with code completion
|
||||
@@ -36,9 +36,9 @@ export function MyComponent() {
|
||||
|
||||
### Özellikler
|
||||
|
||||
Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
|
||||
Prop'ların türünü oluşturun ve dışa aktarmaya gerek yoksa ona `(ComponentName)Props` adını verin.
|
||||
|
||||
Use props destructuring.
|
||||
Props destructuring kullanın.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad, no type
|
||||
@@ -52,7 +52,7 @@ type MyComponentProps = {
|
||||
export const MyComponent = ({ name }: MyComponentProps) => <div>Hello {name}</div>;
|
||||
```
|
||||
|
||||
#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
|
||||
#### Prop türlerini tanımlamak için `React.FC` veya `React.FunctionComponent` kullanmaktan kaçının
|
||||
|
||||
```tsx
|
||||
/* ❌ - Bad, defines the component type annotations with `FC`
|
||||
@@ -67,10 +67,9 @@ const EmailField: React.FC<{
|
||||
```
|
||||
|
||||
```tsx
|
||||
/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
|
||||
* component's props
|
||||
* - This method doesn't automatically include the children prop. If
|
||||
* you want to include it, you have to specify it in OwnProps.
|
||||
/* ✅ - İyi, bileşenin prop'ları için ayrı bir tür (OwnProps) açıkça tanımlanmıştır
|
||||
* - Bu yöntem çocuk prop'unu otomatik olarak içermez.
|
||||
* Onu dahil etmek istiyorsanız, OwnProps'ta belirtmeniz gerekir.
|
||||
*/
|
||||
type EmailFieldProps = {
|
||||
value: string;
|
||||
@@ -94,8 +93,8 @@ const MyComponent = (props: OwnProps) => {
|
||||
```
|
||||
|
||||
```tsx
|
||||
/* ✅ - Good, Explicitly lists all props
|
||||
* - Enhances readability and maintainability
|
||||
/* ✅ - İyi, tüm prop'ları açıkça listeler
|
||||
* - Okunabilirliği ve bakımı arttırır
|
||||
*/
|
||||
const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
|
||||
return <OtherComponent {...{ prop1, prop2, prop3 }} />;
|
||||
@@ -123,18 +122,18 @@ const value = process.env.MY_VALUE ?? 'default';
|
||||
### Opsiyonel zincirleme `?.` kullanın
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
// ❌ Kötü
|
||||
onClick && onClick();
|
||||
|
||||
// ✅ Good
|
||||
// ✅ İyi
|
||||
onClick?.();
|
||||
```
|
||||
|
||||
## TypeScript
|
||||
|
||||
### Use `type` instead of `interface`
|
||||
### `interface` yerine `type` kullanın
|
||||
|
||||
Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
|
||||
Neredeyse her zaman örtüştükleri ve `type` daha esnek olduğu için her zaman `interface` yerine `type` kullanın.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
@@ -148,7 +147,7 @@ type MyType = {
|
||||
};
|
||||
```
|
||||
|
||||
### Use string literals instead of enums
|
||||
### enum'lar yerine string literal'leri kullanın
|
||||
|
||||
[String literalleri](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types), TypeScript'te enum benzeri değerleri yönetmek için en iyi yöntemdir. Pick ve Omit ile genişletilmesi daha kolay olur ve özellikle kod tamamlama ile daha iyi bir geliştirici deneyimi sunarlar.
|
||||
|
||||
@@ -192,13 +191,13 @@ setHotkeyScopeAndMemorizePreviousScope(
|
||||
|
||||
## Şekil Verme
|
||||
|
||||
### Use StyledComponents
|
||||
### StyledComponents kullanın
|
||||
|
||||
Style the components with [styled-components](https://emotion.sh/docs/styled).
|
||||
Bileşenleri [styled-components](https://emotion.sh/docs/styled) ile stillendirin.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
<div className="my-class">Hello World</div>
|
||||
// ❌ Kötü
|
||||
<div className=\"my-class\">Hello World</div>
|
||||
```
|
||||
|
||||
```tsx
|
||||
@@ -258,7 +257,7 @@ const StyledButton = styled.button`
|
||||
`;
|
||||
```
|
||||
|
||||
## Enforcing No-Type Imports
|
||||
## Tip içermeyen importları zorunlu kılma
|
||||
|
||||
Tip ithalatlarından kaçının. Bu standardı uygulamak için bir ESLint kuralı, herhangi bir tip ithalatını kontrol eder ve raporlar. Bu, TypeScript kodunda tutarlılık ve okunabilirliği sağlamaya yardımcı olur.
|
||||
|
||||
@@ -285,6 +284,6 @@ import { Meta, StoryObj } from '@storybook/react';
|
||||
|
||||
ESLint kuralı, `@typescript-eslint/consistent-type-imports`, tip ithalat standardını uygular. Bu kural, herhangi bir tip ithalat ihlali için hata veya uyarı üretir.
|
||||
|
||||
Lütfen unutmayın ki bu kural, istemeden yapılan tip ithalatlarının gerçekleştiği nadir durumları özellikle ele alır. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). Çoğu durumda, yalnızca tip ithalatları kullanmanıza gerek yoktur.
|
||||
Lütfen unutmayın ki bu kural, istemeden yapılan tip ithalatlarının gerçekleştiği nadir durumları özellikle ele alır. TypeScript'in kendisi, [TypeScript 3.8 sürüm notlarında](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html) belirtildiği gibi, bu uygulamayı caydırmaktadır. Çoğu durumda, yalnızca tip ithalatları kullanmanıza gerek yoktur.
|
||||
|
||||
Kodunuzun bu kurala uygun olduğundan emin olmak için, geliştirme iş akışınızın bir parçası olarak ESLint'i çalıştırdığınızdan emin olun.
|
||||
|
||||
+5
-5
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Figma ile Çalışma
|
||||
info: Learn how you can collaborate with Twenty's Figma
|
||||
info: Twenty'nin Figma'sında nasıl işbirliği yapabileceğinizi öğrenin
|
||||
---
|
||||
|
||||
Figma, tasarımcılar ve geliştiriciler arasındaki iletişim engelini aşmaya yardımcı olan işbirliği odaklı bir arayüz tasarım aracıdır.
|
||||
@@ -8,7 +8,7 @@ Bu kılavuz, Figma ile nasıl işbirliği yapacağınızı açıklar.
|
||||
|
||||
## Erişim
|
||||
|
||||
1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
|
||||
1. **Paylaşılan bağlantıya erişin:** Projenin Figma dosyasına [buradan](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty) erişebilirsiniz.
|
||||
2. **Oturum açın:** Henüz oturum açmadıysanız, Figma sizden oturum açmanızı isteyecektir.
|
||||
Geliştirici modu ve ayrılmış bir çerçeveyi seçme yeteneği gibi ana özellikler yalnızca oturum açmış kullanıcılara sunulur.
|
||||
|
||||
@@ -18,7 +18,7 @@ Bu kılavuz, Figma ile nasıl işbirliği yapacağınızı açıklar.
|
||||
|
||||
## Figma yapısı
|
||||
|
||||
On the left sidebar, you can access the different pages of Twenty's Figma. Bu şekilde organize edilmişlerdir:
|
||||
Sol kenar çubuğundan Twenty'nin Figma'sındaki farklı sayfalara erişebilirsiniz. Bu şekilde organize edilmişlerdir:
|
||||
|
||||
* **Bileşenler sayfası:** Bu, ilk sayfadır. Tasarımcı, tasarım dosyası boyunca kullanılan yeniden kullanılabilir tasarım öğelerini oluşturmak ve organize etmek için kullanır. Örneğin, düğmeler, simgeler, semboller veya diğer herhangi bir yeniden kullanılabilir bileşen. Bu, tasarımda tutarlılığı sağlamak amacıyla hizmet eder.
|
||||
* **Ana sayfa:** İkinci sayfa ana sayfadır ve projenin tam kullanıcı arayüzünü gösterir. You can press ***Play*** to use the full app prototype.
|
||||
@@ -36,7 +36,7 @@ Tasarım özelliklerini görmek, CSS kopyalamak ve varlıklara erişmek için ar
|
||||
|
||||
### Prototipi kullan
|
||||
|
||||
Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototip modu, tasarımla nihai ürünmüş gibi etkileşim kurmanızı sağlar. Ekranlar arasındaki akışı gösterir ve düğmeler, bağlantılar veya menüler gibi arayüz öğelerinin etkileşim sırasında nasıl davrandığını gösterir.
|
||||
Prototip görünümüne erişmek için tuvaldeki herhangi bir öğeye tıklayın ve arayüzün sağ üst köşesindeki “Play” düğmesine basın. Prototip modu, tasarımla nihai ürünmüş gibi etkileşim kurmanızı sağlar. Ekranlar arasındaki akışı gösterir ve düğmeler, bağlantılar veya menüler gibi arayüz öğelerinin etkileşim sırasında nasıl davrandığını gösterir.
|
||||
|
||||
1. **Geçişler ve animasyonları anlama:** Prototip modunda, bir tasarımcı tarafından ekranlar veya UI öğeleri arasında eklenen herhangi bir geçişi veya animasyonu görebilir, geliştiricilere hedeflenen davranış ve stille ilgili net görsel talimatlar verir.
|
||||
2. **Uygulama açıklaması:** Bir prototip aynı zamanda belirsizlikleri azaltmaya da yardımcı olabilir. Geliştiriciler, belirli öğelerin işlevselliği veya görünümü hakkında daha iyi bir anlayış kazanmak adına onunla etkileşime geçebilirler.
|
||||
@@ -45,7 +45,7 @@ Figma platformunu öğrenmek ile ilgili daha kapsamlı detaylar ve rehberlik iç
|
||||
|
||||
### Mesafeleri ölç
|
||||
|
||||
Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
|
||||
Bir öğe seçin, (Mac) `Option` tuşunu veya (Windows) `Alt` tuşunu basılı tutun, ardından aralarındaki mesafeyi görmek için başka bir öğenin üzerine gelin.
|
||||
|
||||
### VSCode için Figma uzantısı (Önerilir)
|
||||
|
||||
|
||||
@@ -258,10 +258,10 @@ cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
|
||||
```
|
||||
|
||||
<Info>
|
||||
**Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/tr/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
|
||||
**Çoklu Çalışma Alanı Modu:** Varsayılan olarak, Twenty yalnızca bir çalışma alanının oluşturulabildiği tek çalışma alanı modunda çalışır. Çoklu çalışma alanı desteğini etkinleştirmek için (alt alan adına dayalı özellikleri test etmek açısından kullanışlıdır), sunucunuzdaki `.env` dosyanızda `IS_MULTIWORKSPACE_ENABLED=true` değerini ayarlayın. Ayrıntılar için [Çoklu Çalışma Alanı Modu](/l/tr/developers/self-host/capabilities/setup#multi-workspace-mode) bölümüne bakın.
|
||||
</Info>
|
||||
|
||||
## Step 6: Installing dependencies
|
||||
## Adım 6: Bağımlılıkların yüklenmesi
|
||||
|
||||
Twenty server'ı oluşturup veritabanınıza bazı veriler yerleştirmek için aşağıdaki komutu çalıştırın:
|
||||
|
||||
@@ -313,16 +313,16 @@ Alternatif olarak, tüm hizmetleri aynı anda başlatabilirsiniz:
|
||||
npx nx start
|
||||
```
|
||||
|
||||
## Step 8: Use Twenty
|
||||
## Adım 8: Twenty'yi kullanın
|
||||
|
||||
**Ön Uç**
|
||||
|
||||
Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
|
||||
Twenty'nin ön ucu [http://localhost:3001](http://localhost:3001) adresinde çalışıyor olacak.
|
||||
Varsayılan demo hesabıyla giriş yapabilirsiniz: `tim@apple.dev` (şifre: `tim@apple.dev`)
|
||||
|
||||
**Arka Uç**
|
||||
|
||||
* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
|
||||
* Twenty'nin sunucusu [http://localhost:3000](http://localhost:3000) adresinde çalışır durumda olacak
|
||||
* GraphQL API'sine [http://localhost:3000/graphql](http://localhost:3000/graphql) adresinden erişebilirsiniz.
|
||||
* REST API'sine [http://localhost:3000/rest](http://localhost:3000/rest) adresinden ulaşabilirsiniz.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Contribute
|
||||
description: Contribute to Twenty's open-source development.
|
||||
title: Katkıda Bulunun
|
||||
description: Twenty'nin açık kaynak geliştirmesine katkıda bulunun.
|
||||
---
|
||||
|
||||
<Frame>
|
||||
@@ -9,24 +9,24 @@ description: Contribute to Twenty's open-source development.
|
||||
|
||||
## Genel Bakış
|
||||
|
||||
Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
|
||||
Twenty açık kaynaktır ve topluluktan gelen katkıları memnuniyetle karşılar. İster hataları düzeltiyor, ister özellikler ekliyor ya da belgeleri iyileştiriyor olun, katkılarınız Twenty'yi herkes için daha iyi hâle getirmeye yardımcı olur.
|
||||
|
||||
## Ways to Contribute
|
||||
## Katkıda Bulunma Yolları
|
||||
|
||||
* **Report bugs**: Help identify and document issues
|
||||
* **Submit features**: Propose and implement new functionality
|
||||
* **Improve documentation**: Make our docs clearer and more helpful
|
||||
* **Frontend development**: Work on the React-based UI
|
||||
* **Backend development**: Contribute to the NestJS server
|
||||
* **Hataları bildirin**: Sorunları belirlemeye ve belgelemeye yardımcı olun
|
||||
* **Özellik önerin**: Yeni işlevler önerip uygulayın
|
||||
* **Belgeleri iyileştirin**: Belgelerimizi daha anlaşılır ve daha faydalı hâle getirin
|
||||
* **Ön uç geliştirme**: React tabanlı kullanıcı arayüzü üzerinde çalışın
|
||||
* **Arka uç geliştirme**: NestJS sunucusuna katkıda bulunun
|
||||
|
||||
## Getting Started
|
||||
## Başlarken
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Bug Reports & Requests" icon="bug" href="/l/tr/developers/contribute/capabilities/bug-and-requests">
|
||||
Report issues or request features
|
||||
<Card title="Hata Raporları ve İstekler" icon="bug" href="/l/tr/developers/contribute/capabilities/bug-and-requests">
|
||||
Sorunları bildirin veya özellik talep edin
|
||||
</Card>
|
||||
|
||||
<Card title="Frontend Geliştirme" icon="browser" href="/l/tr/developers/contribute/capabilities/frontend-development">
|
||||
Contribute to the UI
|
||||
Kullanıcı arayüzüne katkıda bulunun
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user