diff --git a/plane-src/apps/api/plane/bgtasks/workspace_seed_task.py b/plane-src/apps/api/plane/bgtasks/workspace_seed_task.py index 218ba2a..e4c6596 100644 --- a/plane-src/apps/api/plane/bgtasks/workspace_seed_task.py +++ b/plane-src/apps/api/plane/bgtasks/workspace_seed_task.py @@ -521,12 +521,12 @@ def workspace_seed(workspace_id: uuid.UUID) -> None: # Create a bot user for creating all the workspace data bot_user = User.objects.create( username=f"bot_user_{workspace.id}", - display_name="Plane", - first_name="Plane", + display_name="NODE.DC", + first_name="NODE.DC", last_name="", is_bot=True, bot_type=BotTypeEnum.WORKSPACE_SEED, - email=f"bot_user_{workspace.id}@plane.so", + email=f"bot_user_{workspace.id}@nodedc.local", password=make_password(uuid.uuid4().hex), is_password_autoset=True, ) diff --git a/plane-src/apps/api/plane/seeds/data/cycles.json b/plane-src/apps/api/plane/seeds/data/cycles.json index 484508f..011e5d2 100644 --- a/plane-src/apps/api/plane/seeds/data/cycles.json +++ b/plane-src/apps/api/plane/seeds/data/cycles.json @@ -1,18 +1,18 @@ [ - { - "id": 1, - "name": "Cycle 1: Getting Started with Plane", - "project_id": 1, - "sort_order": 1, - "timezone": "UTC", - "type": "CURRENT" - }, - { - "id": 2, - "name": "Cycle 2: Collaboration & Customization", - "project_id": 1, - "sort_order": 2, - "timezone": "UTC", - "type": "UPCOMING" - } -] \ No newline at end of file + { + "id": 1, + "name": "Цикл 1: старт в NODE.DC", + "project_id": 1, + "sort_order": 1, + "timezone": "UTC", + "type": "CURRENT" + }, + { + "id": 2, + "name": "Цикл 2: совместная работа", + "project_id": 1, + "sort_order": 2, + "timezone": "UTC", + "type": "UPCOMING" + } +] diff --git a/plane-src/apps/api/plane/seeds/data/issues.json b/plane-src/apps/api/plane/seeds/data/issues.json index be966e7..3c49b8e 100644 --- a/plane-src/apps/api/plane/seeds/data/issues.json +++ b/plane-src/apps/api/plane/seeds/data/issues.json @@ -1,99 +1,124 @@ [ { "id": 1, - "name": "Welcome to Plane 👋", + "name": "Добро пожаловать в NODE.DC Operational Core", "sequence_id": 1, - "description_html": "

Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.

Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.

First thing to try

  1. Look in the Properties section below where it says State: Todo.

  2. Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.

", - "description_stripped": "Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.First thing to tryLook in the Properties section below where it says State: Todo.Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.", + "description_html": "

Это стартовый проект внутри NODE.DC Operational Core. Он создан автоматически, чтобы показать базовые сценарии: проекты, рабочие элементы, участников, представления, циклы и настройки.

Карточки ниже можно открывать, двигать между статусами и редактировать. Это учебный набор — его можно удалить, когда workspace будет настроен под реальную работу.

Первое действие:

  1. Откройте свойства карточки и найдите поле Статус.

  2. Переведите карточку в Готово через выпадающий список или перетащите её в соответствующую колонку.

", + "description_stripped": "Это стартовый проект внутри NODE.DC Operational Core. Он создан автоматически, чтобы показать базовые сценарии: проекты, рабочие элементы, участников, представления, циклы и настройки. Карточки ниже можно открывать, двигать между статусами и редактировать. Это учебный набор — его можно удалить, когда workspace будет настроен под реальную работу. Первое действие: Откройте свойства карточки и найдите поле Статус. Переведите карточку в Готово через выпадающий список или перетащите её в соответствующую колонку.", "sort_order": 1000, "state_id": 4, "labels": [], "priority": "urgent", "project_id": 1, "cycle_id": 1, - "module_ids": [1] + "module_ids": [ + 1 + ] }, { "id": 2, - "name": "1. Create Projects 🎯", + "name": "1. Создайте проект", "sequence_id": 2, - "description_html": "


A Project in Plane is where all your work comes together. Think of it as a base that organizes your work items and everything else your team needs to get things done.

Note: This tutorial is already set up as a Project, and these cards you're reading are work items within it!

We're showing you how to create a new project just so you'll know exactly what to do when you're ready to start your own real one.

  1. Look over at the left sidebar and find where it says Projects.

  2. Hover your mouse there and you'll see a little + icon pop up - go ahead and click it!

  3. A modal opens where you can give your project a name and other details.

  4. Notice the Access type options? Public means anyone (except Guest users) can see and join it, while Private keeps it just for those you invite.

    Tip: You can also quickly create a new project by using the keyboard shortcut P from anywhere in Plane!

", + "description_html": "

Проект собирает рабочие элементы, участников, настройки и представления в одном контуре. В NODE.DC проект может быть отдельным направлением, процессом или командной зоной.

Важно: этот учебный набор уже создан как проект. Ниже показано, где создать следующий реальный проект, когда он понадобится.

  1. Откройте раздел Проекты в верхней навигации.

  2. Нажмите кнопку добавления проекта и задайте название, идентификатор и тип доступа.

  3. Публичный проект доступен участникам workspace, приватный — только приглашённым участникам проекта.

    Совет: для быстрого создания проекта используйте клавишу P, если фокус не находится в поле ввода.

", + "description_stripped": "Проект собирает рабочие элементы, участников, настройки и представления в одном контуре. В NODE.DC проект может быть отдельным направлением, процессом или командной зоной. Важно: этот учебный набор уже создан как проект. Ниже показано, где создать следующий реальный проект, когда он понадобится. Откройте раздел Проекты в верхней навигации. Нажмите кнопку добавления проекта и задайте название, идентификатор и тип доступа. Публичный проект доступен участникам workspace, приватный — только приглашённым участникам проекта. Совет: для быстрого создания проекта используйте клавишу P, если фокус не находится в поле ввода.", "sort_order": 2000, "state_id": 2, - "labels": [2], + "labels": [ + 2 + ], "priority": "high", "project_id": 1, "cycle_id": 1, - "module_ids": [1] + "module_ids": [ + 1 + ] }, { "id": 3, - "name": "2. Invite your team 🤜🤛", + "name": "2. Пригласите участников", "sequence_id": 3, - "description_html": "

Let's get your teammates on board!

First, you'll need to invite them to your workspace before they can join specific projects:

  1. Click on your workspace name in the top-left corner, then select Settings from the dropdown.

  2. Head over to the Members tab - this is your user management hub. Click Add member on the top right.

  3. Enter your teammate's email address. Select a role for them (Admin, Member or Guest) that determines what they can do in the workspace.

  4. Your team member will get an email invite. Once they've joined your workspace, you can add them to specific projects.

  5. To do this, go to your project's Settings page.

  6. Find the Members section, select your teammate, and assign them a project role - this controls what they can do within just this project.


That's it!

To learn more about user management, see Manage users and roles.

", - "description_stripped": "Let's get your teammates on board!First, you'll need to invite them to your workspace before they can join specific projects:Click on your workspace name in the top-left corner, then select Settings from the dropdown.Head over to the Members tab - this is your user management hub. Click Add member on the top right.Enter your teammate's email address. Select a role for them (Admin, Member or Guest) that determines what they can do in the workspace.Your team member will get an email invite. Once they've joined your workspace, you can add them to specific projects.To do this, go to your project's Settings page.Find the Members section, select your teammate, and assign them a project role - this controls what they can do within just this project.That's it!To learn more about user management, see Manage users and roles.", + "description_html": "

Участники сначала добавляются в workspace, а затем получают роли в конкретных проектах. Это разделяет общий доступ к среде и права внутри отдельных процессов.

  1. Откройте меню workspace и перейдите в Настройки.

  2. В разделе Участники нажмите Добавить участника.

  3. Укажите email и выберите роль: Админ, Участник или Гость.

  4. После подтверждения участника можно добавить в нужный проект через настройки проекта.

В enterprise-контуре доступы могут управляться из Launcher. В этом случае локальные приглашения могут быть ограничены политикой NODE.DC.

", + "description_stripped": "Участники сначала добавляются в workspace, а затем получают роли в конкретных проектах. Это разделяет общий доступ к среде и права внутри отдельных процессов. Откройте меню workspace и перейдите в Настройки. В разделе Участники нажмите Добавить участника. Укажите email и выберите роль: Админ, Участник или Гость. После подтверждения участника можно добавить в нужный проект через настройки проекта. В enterprise-контуре доступы могут управляться из Launcher. В этом случае локальные приглашения могут быть ограничены политикой NODE.DC.", "sort_order": 3000, "state_id": 1, "labels": [], "priority": "high", "project_id": 1, "cycle_id": 1, - "module_ids": [1, 2] + "module_ids": [ + 1, + 2 + ] }, { "id": 4, - "name": "3. Create and assign Work Items ✏️", + "name": "3. Создавайте рабочие элементы", "sequence_id": 4, - "description_html": "

A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.

Ready to add something to your project's to-do list? Here's how:

  1. Click the Add work item button in the top-right corner of the Work Items page.

  2. Give your task a clear title and add any details in the description.

  3. Set up the essentials:

Tip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!

Want to dive deeper into all the things you can do with work items? Check out our documentation.

", - "description_stripped": "A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.Ready to add something to your project's to-do list? Here's how:Click the Add work item button in the top-right corner of the Work Items page.Give your task a clear title and add any details in the description.Set up the essentials:Assign it to a team member (or yourself!)Choose a priority levelAdd start and due dates if there's a timelineTip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!Want to dive deeper into all the things you can do with work items? Check out our documentation.", + "description_html": "

Рабочий элемент — базовая единица работы в проекте. Это может быть задача, запрос, поручение, дефект или любой другой управляемый объект.

  1. Нажмите кнопку Добавить рабочий элемент в проекте.

  2. Задайте понятное название и описание.

  3. Заполните базовые свойства: исполнитель, статус, приоритет, дата начала и срок.

Совет: используйте клавишу C, чтобы быстро создать рабочий элемент из проекта.

", + "description_stripped": "Рабочий элемент — базовая единица работы в проекте. Это может быть задача, запрос, поручение, дефект или любой другой управляемый объект. Нажмите кнопку Добавить рабочий элемент в проекте. Задайте понятное название и описание. Заполните базовые свойства: исполнитель, статус, приоритет, дата начала и срок. Совет: используйте клавишу C, чтобы быстро создать рабочий элемент из проекта.", "sort_order": 4000, "state_id": 3, - "labels": [2], + "labels": [ + 2 + ], "priority": "high", "project_id": 1, "cycle_id": 1, - "module_ids": [1, 2] + "module_ids": [ + 1, + 2 + ] }, { "id": 5, - "name": "4. Visualize your work 🔮", + "name": "4. Переключайте представления", "sequence_id": 5, - "description_html": "

Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!

Switch between layouts

  1. Look at the top toolbar in your project. You'll see several layout icons.

  2. Click any of these icons to instantly switch between layouts.

Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.

Filter and display options

Need to focus on specific work?

  1. Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.

  2. Click the Display dropdown to tailor how the information appears in your layout

  3. Created the perfect setup? Save it for later by clicking the the Save View button.

  4. Access saved views anytime from the Views section in your sidebar.

", - "description_stripped": "Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!Switch between layoutsLook at the top toolbar in your project. You'll see several layout icons.Click any of these icons to instantly switch between layouts.Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.Filter and display optionsNeed to focus on specific work?Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.Click the Display dropdown to tailor how the information appears in your layoutCreated the perfect setup? Save it for later by clicking the the Save View button.Access saved views anytime from the Views section in your sidebar.", + "description_html": "

NODE.DC Operational Core позволяет смотреть на одну и ту же работу разными способами: списком, доской, календарём, таблицей или таймлайном.

Смена layout

  1. Используйте нижнюю панель режимов, чтобы переключаться между видами.

  2. Откройте фильтры, если нужно сфокусироваться на конкретных статусах, исполнителях или сроках.

  3. Сохраните удачную конфигурацию как отдельное представление.

Совет: доска удобна для статусов, календарь — для сроков, список — для плотной операционной работы.

", + "description_stripped": "NODE.DC Operational Core позволяет смотреть на одну и ту же работу разными способами: списком, доской, календарём, таблицей или таймлайном. Смена layout. Используйте нижнюю панель режимов, чтобы переключаться между видами. Откройте фильтры, если нужно сфокусироваться на конкретных статусах, исполнителях или сроках. Сохраните удачную конфигурацию как отдельное представление. Совет: доска удобна для статусов, календарь — для сроков, список — для плотной операционной работы.", "sort_order": 5000, "state_id": 3, "labels": [], "priority": "none", "project_id": 1, "cycle_id": 2, - "module_ids": [2] + "module_ids": [ + 2 + ] }, { "id": 6, - "name": "5. Use Cycles to time box tasks 🗓️", + "name": "5. Используйте циклы", "sequence_id": 6, - "description_html": "

A Cycle in Plane is like a sprint - a dedicated timeframe where your team focuses on completing specific work items. It helps you break down your project into manageable chunks with clear start and end dates so everyone knows what to work on and when it needs to be done.

Setup Cycles

  1. Go to the Cycles section in your project (you can find it in the left sidebar)

  2. Click the Add cycle button in the top-right corner

  3. Enter details and set the start and end dates for your cycle.

  4. Click Create cycle and you're ready to go!

  5. Add existing work items to the Cycle or create new ones.

Tip: To create a new Cycle quickly, just press Q from anywhere in your project!

Want to learn more?

Check out our detailed documentation for everything you need to know!

", - "description_stripped": "A Cycle in Plane is like a sprint - a dedicated timeframe where your team focuses on completing specific work items. It helps you break down your project into manageable chunks with clear start and end dates so everyone knows what to work on and when it needs to be done.Setup CyclesGo to the Cycles section in your project (you can find it in the left sidebar)Click the Add cycle button in the top-right cornerEnter details and set the start and end dates for your cycle.Click Create cycle and you're ready to go!Add existing work items to the Cycle or create new ones.Tip: To create a new Cycle quickly, just press Q from anywhere in your project!Want to learn more?Starting and stopping cyclesTransferring work items between cyclesTracking progress with chartsCheck out our detailed documentation for everything you need to know!", + "description_html": "

Цикл — это ограниченный период работы. Он помогает собрать задачи в понятный временной контур и видеть, что команда должна завершить в ближайшем интервале.

Настройка цикла

  1. Откройте раздел Циклы в проекте.

  2. Создайте цикл, задайте даты начала и завершения.

  3. Добавьте существующие рабочие элементы или создайте новые прямо внутри цикла.

Совет: быстрый вызов создания цикла доступен через клавишу Q.

", + "description_stripped": "Цикл — это ограниченный период работы. Он помогает собрать задачи в понятный временной контур и видеть, что команда должна завершить в ближайшем интервале. Настройка цикла. Откройте раздел Циклы в проекте. Создайте цикл, задайте даты начала и завершения. Добавьте существующие рабочие элементы или создайте новые прямо внутри цикла. Совет: быстрый вызов создания цикла доступен через клавишу Q.", "sort_order": 6000, "state_id": 1, - "labels": [2], + "labels": [ + 2 + ], "priority": "low", "project_id": 1, "cycle_id": 2, - "module_ids": [2, 3] + "module_ids": [ + 2, + 3 + ] }, { "id": 7, - "name": "6. Customize your settings ⚙️", + "name": "6. Настройте workspace", "sequence_id": 7, - "description_html": "

Now that you're getting familiar with Plane, let's explore how you can customize settings to make it work just right for you and your team!

Workspace settings

Remember those workspace settings we mentioned when inviting team members? There's a lot more you can do there:

Project Settings

Each project has its own settings where you can:

Your Profile Settings

You can also customize your own personal experience! Click on your profile icon in the top-right corner to find:

Taking a few minutes to set things up just the way you like will make your everyday Plane experience much smoother!

Note: Some settings are only available to workspace or project admins. If you don't see certain options, you might need admin access.

", - "description_stripped": "Now that you're getting familiar with Plane, let's explore how you can customize settings to make it work just right for you and your team!Workspace settingsRemember those workspace settings we mentioned when inviting team members? There's a lot more you can do there:Invite and manage workspace membersUpgrade plans and manage billingImport data from other toolsExport your dataManage integrationsProject SettingsEach project has its own settings where you can:Change project details and visibilityInvite specific members to just this projectCustomize your workflow States (like adding a \"Testing\" state)Create and organize LabelsEnable or disable features you need (or don't need)Your Profile SettingsYou can also customize your own personal experience! Click on your profile icon in the top-right corner to find:Profile settings (update your name, photo, etc.)Choose your timezone and preferred language for the interfaceEmail notification preferences (what you want to be alerted about)Appearance settings (light/dark mode)Taking a few minutes to set things up just the way you like will make your everyday Plane experience much smoother!Note: Some settings are only available to workspace or project admins. If you don't see certain options, you might need admin access.", + "description_html": "

После знакомства с базовой доской настройте workspace под рабочий процесс команды.

Что проверить

Важно: если workspace подключён к enterprise-контуру NODE.DC Launcher, часть локальных настроек может быть заблокирована политикой платформы.

", + "description_stripped": "После знакомства с базовой доской настройте workspace под рабочий процесс команды. Что проверить: участники workspace и их роли; участники конкретных проектов; статусы workflow, метки и представления; уведомления, профиль и внешний вид интерфейса. Важно: если workspace подключён к enterprise-контуру NODE.DC Launcher, часть локальных настроек может быть заблокирована политикой платформы.", "sort_order": 7000, "state_id": 1, "labels": [], "priority": "none", "project_id": 1, "cycle_id": 2, - "module_ids": [2, 3] + "module_ids": [ + 2, + 3 + ] } ] diff --git a/plane-src/apps/api/plane/seeds/data/labels.json b/plane-src/apps/api/plane/seeds/data/labels.json index f7286a6..450c045 100644 --- a/plane-src/apps/api/plane/seeds/data/labels.json +++ b/plane-src/apps/api/plane/seeds/data/labels.json @@ -1,14 +1,14 @@ [ { "id": 1, - "name": "admin", + "name": "администрирование", "color": "#0693e3", "sort_order": 85535, "project_id": 1 }, { "id": 2, - "name": "concepts", + "name": "обучение", "color": "#9900ef", "sort_order": 95535, "project_id": 1 diff --git a/plane-src/apps/api/plane/seeds/data/modules.json b/plane-src/apps/api/plane/seeds/data/modules.json index f770276..eeefa4b 100644 --- a/plane-src/apps/api/plane/seeds/data/modules.json +++ b/plane-src/apps/api/plane/seeds/data/modules.json @@ -1,26 +1,26 @@ [ - { - "id": 1, - "name": "Core Workflow (System)", - "project_id": 1, - "sort_order": 1, - "status": "planned", - "description": "Manage, visualize, and track your work items across views." - }, - { - "id": 2, - "name": "Onboarding Flow (Feature)", - "project_id": 1, - "sort_order": 2, - "status": "backlog", - "description": "Everything about getting started - creating a project, inviting teammates." - }, - { - "id": 3, - "name": "Workspace Setup (Area)", - "project_id": 1, - "sort_order": 3, - "status": "in-progress", - "description": "The personalization layer - settings, labels, automations." - } -] \ No newline at end of file + { + "id": 1, + "name": "Базовый workflow", + "project_id": 1, + "sort_order": 1, + "status": "planned", + "description": "Стартовый модуль NODE.DC для рабочих элементов, статусов, исполнителей и представлений." + }, + { + "id": 2, + "name": "Онбординг команды", + "project_id": 1, + "sort_order": 2, + "status": "backlog", + "description": "Сценарии запуска workspace: проект, участники, роли и первые рабочие элементы." + }, + { + "id": 3, + "name": "Настройка workspace", + "project_id": 1, + "sort_order": 3, + "status": "in-progress", + "description": "Персонализация рабочей среды: метки, циклы, модули, представления и настройки." + } +] diff --git a/plane-src/apps/api/plane/seeds/data/pages.json b/plane-src/apps/api/plane/seeds/data/pages.json index 00c5c91..2fdf65b 100644 --- a/plane-src/apps/api/plane/seeds/data/pages.json +++ b/plane-src/apps/api/plane/seeds/data/pages.json @@ -1,30 +1,50 @@ [ { "id": 1, - "name": "Project Design Spec", - "project_id": 1, - "description_html": "

Welcome to your Project Pages — the documentation hub for this specific project.
Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.

🧭 Project Summary

Field

Details

Project Name

Add your project name

Owner

Add project owner(s)

Status

🟢 Active / 🟡 In Progress / 🔴 Blocked

Start Date

Target Release

Linked Modules

Engineering, Security

Cycle(s)

Cycle 1, Cycle 2

🧩 Use tables to summarize key project metadata or links.

🎯 Goals & Objectives

🎯 Primary Goals

Success Metrics

Metric

Target

Owner

User adoption

100 active users

Growth

Performance

< 200ms latency

Backend

Design feedback

≥ 8/10 average rating

Design

📈 Define measurable outcomes and track progress alongside issues.

🧩 Scope & Deliverables

Deliverable

Owner

Status

Authentication flow

Backend

Done

Issue board UI

Frontend

🏗 In Progress

API integration

Backend

Pending

Documentation

PM

📝 Drafting

🧩 Use tables or checklists to track scope and ownership.

🧱 Architecture or System Design

Use this section for technical deep dives or diagrams.

Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs

", - "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Welcome to your \", \"type\": \"text\"}, {\"text\": \"Project Pages\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — the documentation hub for this specific project.\", \"type\": \"text\"}, {\"type\": \"hardBreak\"}, {\"text\": \"Each project in Plane can have its own Wiki space where you track \", \"type\": \"text\"}, {\"text\": \"plans, specs, updates, and learnings\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — all connected to your issues and modules.\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"compass\"}}, {\"text\": \" Project Summary\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Field\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Details\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Project Name\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"pencil\"}}, {\"text\": \" Add your project name\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Add project owner(s)\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"green_circle\"}}, {\"text\": \" Active / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"yellow_circle\"}}, {\"text\": \" In Progress / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"red_circle\"}}, {\"text\": \" Blocked\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Start Date\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target Release\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Linked Modules\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Engineering, Security\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle(s)\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle 1, Cycle 2\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables to summarize key project metadata or links.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Goals & Objectives\", \"type\": \"text\"}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Primary Goals\", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliver MVP with all core features\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Validate feature adoption with early users\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Prepare launch plan for v1 release\", \"type\": \"text\"}]}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"gear\"}}, {\"text\": \" Success Metrics\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Metric\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"User adoption\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"100 active users\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Growth\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Performance\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"< 200ms latency\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design feedback\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"≥ 8/10 average rating\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"chart_increasing\"}}, {\"text\": \" Define measurable outcomes and track progress alongside issues.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Scope & Deliverables\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliverable\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Authentication flow\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Done\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Issue board UI\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Frontend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"building_construction\"}}, {\"text\": \" In Progress\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"API integration\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"hourglass_flowing_sand\"}}, {\"text\": \" Pending\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Documentation\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"PM\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"memo\"}}, {\"text\": \" Drafting\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables or checklists to track scope and ownership.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Architecture or System Design\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Use this section for \", \"type\": \"text\"}, {\"text\": \"technical deep dives\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" or diagrams.\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"Frontend → GraphQL → Backend → PostgreSQL\\nRedis for caching | RabbitMQ for background jobs\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", - "description_stripped": "Welcome to your Project Pages — the documentation hub for this specific project.Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.🧭 Project SummaryFieldDetailsProject Name✏ Add your project nameOwnerAdd project owner(s)Status🟢 Active / 🟡 In Progress / 🔴 BlockedStart Date—Target Release—Linked ModulesEngineering, SecurityCycle(s)Cycle 1, Cycle 2🧩 Use tables to summarize key project metadata or links.🎯 Goals & Objectives🎯 Primary GoalsDeliver MVP with all core featuresValidate feature adoption with early usersPrepare launch plan for v1 release⚙ Success MetricsMetricTargetOwnerUser adoption100 active usersGrowthPerformance< 200ms latencyBackendDesign feedback≥ 8/10 average ratingDesign📈 Define measurable outcomes and track progress alongside issues.🧩 Scope & DeliverablesDeliverableOwnerStatusAuthentication flowBackend✅ DoneIssue board UIFrontend🏗 In ProgressAPI integrationBackend⏳ PendingDocumentationPM📝 Drafting🧩 Use tables or checklists to track scope and ownership.🧱 Architecture or System DesignUse this section for technical deep dives or diagrams.Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs", - "type": "PROJECT", + "name": "Шаблон описания проекта", + "description_json": { + "type": "doc", + "content": [ + { + "type": "paragraph", + "attrs": { "textAlign": null }, + "content": [ + { + "type": "text", + "text": "Эта страница создана NODE.DC как стартовый шаблон для описания проекта: цель, ответственные, статус, сроки и связанные рабочие элементы." + } + ] + } + ] + }, + "description_html": "

Эта страница создана NODE.DC как стартовый шаблон для описания проекта.

Что зафиксировать

Используйте страницу как краткую карту проекта. Если шаблон не нужен, его можно удалить.

", + "description_stripped": "Эта страница создана NODE.DC как стартовый шаблон для описания проекта. Что зафиксировать: цель проекта и ожидаемый результат; ответственных и участников; сроки, статус и ключевые риски; ссылки на рабочие элементы, циклы и модули. Используйте страницу как краткую карту проекта. Если шаблон не нужен, его можно удалить.", "access": 0, - "logo_props": { - "emoji": { - "url": "https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f680.png", - "value": "128640" - }, - "in_use": "emoji" - } + "type": "PROJECT", + "project_id": 1 }, { "id": 2, - "name": "Project Draft proposal", - "project_id": 1, - "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"This is your \", \"type\": \"text\"}, {\"text\": \"Project Draft area\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"It’s visible only to you (and collaborators you explicitly share with).\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"writing_hand\"}}, {\"text\": \" Current Work in Progress\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"speech_balloon\"}}, {\"text\": \" Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.\", \"type\": \"text\"}]}]}, {\"type\": \"taskList\", \"content\": [{\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Outline project summary and goals\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Draft new feature spec\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Review dependency list\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Collect team feedback for next iteration\", \"type\": \"text\"}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Tip: Turn these items into actionable issues when finalized.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Prototype Commands (if technical)\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"You can also use \", \"type\": \"text\"}, {\"text\": \"code blocks\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" to store snippets, scripts, or notes:\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"# Rebuild Docker containers\\ndocker compose build backend frontend\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", - "description_html": "

This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.

It’s visible only to you (and collaborators you explicitly share with).

Current Work in Progress

💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.

Tip: Turn these items into actionable issues when finalized.

🧱 Prototype Commands (if technical)

You can also use code blocks to store snippets, scripts, or notes:

# Rebuild Docker containers\ndocker compose build backend frontend

", - "description_stripped": "This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.It’s visible only to you (and collaborators you explicitly share with).✍ Current Work in Progress💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet. Outline project summary and goals Draft new feature spec Review dependency list Collect team feedback for next iteration✅ Tip: Turn these items into actionable issues when finalized.🧱 Prototype Commands (if technical)You can also use code blocks to store snippets, scripts, or notes:# Rebuild Docker containers\ndocker compose build backend frontend", + "name": "Черновик рабочего процесса", + "description_json": { + "type": "doc", + "content": [ + { + "type": "paragraph", + "attrs": { "textAlign": null }, + "content": [ + { + "type": "text", + "text": "Черновик NODE.DC для быстрых заметок, идей и внутренних решений до переноса в рабочие элементы." + } + ] + } + ] + }, + "description_html": "

Черновик NODE.DC для быстрых заметок, идей и внутренних решений до переноса в рабочие элементы.

Как использовать

Черновик виден в проекте и помогает не терять контекст до оформления задач.

", + "description_stripped": "Черновик NODE.DC для быстрых заметок, идей и внутренних решений до переноса в рабочие элементы. Как использовать: зафиксировать гипотезу или решение; разложить работу на рабочие элементы; назначить ответственных и сроки. Черновик виден в проекте и помогает не терять контекст до оформления задач.", + "access": 0, "type": "PROJECT", - "access": 1, - "logo_props": "{\"emoji\": {\"url\": \"https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f9f1.png\", \"value\": \"129521\"}, \"in_use\": \"emoji\"}" + "project_id": 1 } ] diff --git a/plane-src/apps/api/plane/seeds/data/projects.json b/plane-src/apps/api/plane/seeds/data/projects.json index 1b24b86..bf8063e 100644 --- a/plane-src/apps/api/plane/seeds/data/projects.json +++ b/plane-src/apps/api/plane/seeds/data/projects.json @@ -1,17 +1,17 @@ [ { "id": 1, - "name": "Plane Demo Project", - "identifier": "PDP", - "description": "Welcome to the Plane Demo Project! This project throws you into the driver’s seat of Plane, work management software. Through curated work items, you’ll uncover key features, pick up best practices, and see how Plane can streamline your team’s workflow. Whether you’re a startup hungry to scale or an enterprise sharpening efficiency, this demo is your launchpad to mastering Plane. Jump in and see what it can do!", + "name": "NODE.DC стартовый проект", + "identifier": "NDC", + "description": "Стартовый проект NODE.DC Operational Core. Он создаётся автоматически вместе с новым workspace и содержит короткий учебный маршрут по базовым возможностям: проекты, рабочие элементы, участники, представления, циклы и настройки.", "network": 2, - "cover_image": "https://images.unsplash.com/photo-1691230995681-480d86cbc135?auto=format&fit=crop&q=80&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&w=870&q=80", + "cover_image": "/seed-assets/nodedc/project-cover.jpg", "logo_props": { - "emoji": { - "url": "https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f447.png", - "value": "128071" + "icon": { + "name": "empty_dashboard", + "color": "#95999f" }, - "in_use": "emoji" + "in_use": "icon" } } ] diff --git a/plane-src/apps/api/plane/seeds/data/states.json b/plane-src/apps/api/plane/seeds/data/states.json index 5eff65b..79d8d27 100644 --- a/plane-src/apps/api/plane/seeds/data/states.json +++ b/plane-src/apps/api/plane/seeds/data/states.json @@ -1,7 +1,7 @@ [ { "id": 1, - "name": "Backlog", + "name": "Бэклог", "color": "#A3A3A3", "sequence": 15000, "group": "backlog", @@ -10,7 +10,7 @@ }, { "id": 2, - "name": "Todo", + "name": "К выполнению", "color": "#3A3A3A", "sequence": 25000, "group": "unstarted", @@ -19,7 +19,7 @@ }, { "id": 3, - "name": "In Progress", + "name": "В работе", "color": "#F59E0B", "sequence": 35000, "group": "started", @@ -28,7 +28,7 @@ }, { "id": 4, - "name": "Done", + "name": "Готово", "color": "#16A34A", "sequence": 45000, "group": "completed", @@ -37,7 +37,7 @@ }, { "id": 5, - "name": "Cancelled", + "name": "Отменено", "color": "#EF4444", "sequence": 55000, "group": "cancelled", diff --git a/plane-src/apps/api/plane/seeds/data/views.json b/plane-src/apps/api/plane/seeds/data/views.json index f9d1823..36e503e 100644 --- a/plane-src/apps/api/plane/seeds/data/views.json +++ b/plane-src/apps/api/plane/seeds/data/views.json @@ -1,8 +1,8 @@ [ { "id": 1, - "name": "Project Urgent Tasks", - "description": "Project Urgent Tasks", + "name": "Срочные рабочие элементы", + "description": "Срочные рабочие элементы проекта", "access": 1, "filters": {}, "project_id": 1, @@ -11,4 +11,4 @@ "sort_order": 75535, "rich_filters": {"priority__in": "urgent"} } -] \ No newline at end of file +] diff --git a/plane-src/apps/web/core/hooks/editor/use-editor-config.ts b/plane-src/apps/web/core/hooks/editor/use-editor-config.ts index 98eb92c..5ed9847 100644 --- a/plane-src/apps/web/core/hooks/editor/use-editor-config.ts +++ b/plane-src/apps/web/core/hooks/editor/use-editor-config.ts @@ -17,6 +17,9 @@ import { useFileSize } from "@/plane-web/hooks/use-file-size"; import { FileService } from "@/services/file.service"; const fileService = new FileService(); +const isHttpUrl = (path?: string) => !!path && /^https?:\/\//i.test(path); +const isPublicPath = (path?: string) => !!path && path.startsWith("/") && !path.startsWith("//"); + type TArgs = { projectId?: string; uploadFile: TFileHandler["upload"]; @@ -44,7 +47,10 @@ export const useEditorConfig = () => { return res?.exists ?? false; }, delete: async (src: string) => { - if (src?.startsWith("http")) { + if (isPublicPath(src)) { + return; + } + if (isHttpUrl(src)) { await fileService.deleteOldWorkspaceAsset(workspaceId, src); } else { await fileService.deleteNewAsset( @@ -58,7 +64,7 @@ export const useEditorConfig = () => { }, getAssetDownloadSrc: async (path) => { if (!path) return ""; - if (path?.startsWith("http")) { + if (isHttpUrl(path) || isPublicPath(path)) { return path; } else { return ( @@ -72,7 +78,7 @@ export const useEditorConfig = () => { }, getAssetSrc: async (path) => { if (!path) return ""; - if (path?.startsWith("http")) { + if (isHttpUrl(path) || isPublicPath(path)) { return path; } else { return ( @@ -85,14 +91,17 @@ export const useEditorConfig = () => { } }, restore: async (src: string) => { - if (src?.startsWith("http")) { + if (isPublicPath(src)) { + return; + } + if (isHttpUrl(src)) { await fileService.restoreOldEditorAsset(workspaceId, src); } else { await fileService.restoreNewAsset(workspaceSlug, src); } }, upload: uploadFile, - duplicate: duplicateFile, + duplicate: async (assetId: string) => (isPublicPath(assetId) ? assetId : duplicateFile(assetId)), validation: { maxFileSize, }, diff --git a/plane-src/apps/web/public/seed-assets/nodedc/add-work-item.png b/plane-src/apps/web/public/seed-assets/nodedc/add-work-item.png new file mode 100644 index 0000000..709248e Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/add-work-item.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/add-work-item2.png b/plane-src/apps/web/public/seed-assets/nodedc/add-work-item2.png new file mode 100644 index 0000000..feccc20 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/add-work-item2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/cycles.png b/plane-src/apps/web/public/seed-assets/nodedc/cycles.png new file mode 100644 index 0000000..d364d07 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/cycles.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/cycles2.png b/plane-src/apps/web/public/seed-assets/nodedc/cycles2.png new file mode 100644 index 0000000..7c079da Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/cycles2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/layouts.png b/plane-src/apps/web/public/seed-assets/nodedc/layouts.png new file mode 100644 index 0000000..95a941e Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/layouts.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/layouts2.png b/plane-src/apps/web/public/seed-assets/nodedc/layouts2.png new file mode 100644 index 0000000..8006ea7 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/layouts2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/project-cover.jpg b/plane-src/apps/web/public/seed-assets/nodedc/project-cover.jpg new file mode 100644 index 0000000..7d21af4 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/project-cover.jpg differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/project-settings.png b/plane-src/apps/web/public/seed-assets/nodedc/project-settings.png new file mode 100644 index 0000000..b922806 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/project-settings.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/project-settings2.png b/plane-src/apps/web/public/seed-assets/nodedc/project-settings2.png new file mode 100644 index 0000000..ca86811 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/project-settings2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar.png b/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar.png new file mode 100644 index 0000000..8e84e7c Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar2.png b/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar2.png new file mode 100644 index 0000000..56da493 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/project-sidebar2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/workspace-members.png b/plane-src/apps/web/public/seed-assets/nodedc/workspace-members.png new file mode 100644 index 0000000..ef2f6cc Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/workspace-members.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/workspace-members2.png b/plane-src/apps/web/public/seed-assets/nodedc/workspace-members2.png new file mode 100644 index 0000000..7abefca Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/workspace-members2.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu.png b/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu.png new file mode 100644 index 0000000..1979616 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu.png differ diff --git a/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu2.png b/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu2.png new file mode 100644 index 0000000..ca42313 Binary files /dev/null and b/plane-src/apps/web/public/seed-assets/nodedc/workspace-menu2.png differ diff --git a/plane-src/apps/web/styles/globals.css b/plane-src/apps/web/styles/globals.css index 7bcd12d..da8d5ba 100644 --- a/plane-src/apps/web/styles/globals.css +++ b/plane-src/apps/web/styles/globals.css @@ -5597,6 +5597,20 @@ color: var(--text-color-primary) !important; } + .editor-callout-component { + border: 0 !important; + outline: none !important; + box-shadow: + inset 0 0 0 1px rgba(var(--nodedc-accent-rgb), 0.18), + inset 0 1px 0 rgba(255, 255, 255, 0.018), + 0 10px 28px rgba(0, 0, 0, 0.08) !important; + border-radius: 1.35rem !important; + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.028) 0%, rgba(255, 255, 255, 0.012) 100%), + rgba(255, 255, 255, 0.025) !important; + color: var(--text-color-secondary) !important; + } + .nodedc-attachment-upload[data-drag-reject="true"] { box-shadow: inset 0 0 0 1px rgba(var(--nodedc-accent-rgb), 0.4), diff --git a/plane-src/packages/editor/src/core/extensions/callout/block.tsx b/plane-src/packages/editor/src/core/extensions/callout/block.tsx index 4d1fb21..22d4113 100644 --- a/plane-src/packages/editor/src/core/extensions/callout/block.tsx +++ b/plane-src/packages/editor/src/core/extensions/callout/block.tsx @@ -32,11 +32,14 @@ export function CustomCalloutBlock(props: CustomCalloutNodeViewProps) { const [isColorPickerOpen, setIsColorPickerOpen] = useState(false); // derived values const activeBackgroundColor = COLORS_LIST.find((c) => node.attrs["data-background"] === c.key)?.backgroundColor; + const isLogoHidden = node.attrs["data-logo-in-use"] === "none"; return ( ${attrs[\n` ); - } else { + state.write("> \n"); + } else if (logoInUse === "icon") { state.write(`> ${attrs["data-icon-name"]} icon\n`); + state.write("> \n"); } - // add an empty line after the logo - state.write("> \n"); // add '> ' before each line of the callout content state.wrapBlock("> ", null, node, () => state.renderContent(node)); state.closeBlock(node); diff --git a/plane-src/packages/editor/src/core/extensions/callout/logo-selector.tsx b/plane-src/packages/editor/src/core/extensions/callout/logo-selector.tsx index a12c137..aac0a98 100644 --- a/plane-src/packages/editor/src/core/extensions/callout/logo-selector.tsx +++ b/plane-src/packages/editor/src/core/extensions/callout/logo-selector.tsx @@ -24,6 +24,8 @@ type Props = { export function CalloutBlockLogoSelector(props: Props) { const { blockAttributes, disabled, handleOpen, isOpen, updateAttributes } = props; + if (blockAttributes["data-logo-in-use"] === "none") return null; + const logoValue: TLogoProps = { in_use: blockAttributes["data-logo-in-use"], icon: { diff --git a/plane-src/packages/editor/src/core/extensions/callout/types.ts b/plane-src/packages/editor/src/core/extensions/callout/types.ts index 3ec0529..473ea47 100644 --- a/plane-src/packages/editor/src/core/extensions/callout/types.ts +++ b/plane-src/packages/editor/src/core/extensions/callout/types.ts @@ -29,7 +29,7 @@ export type TCalloutBlockEmojiAttributes = { export type TCalloutBlockAttributes = { [ECalloutAttributeNames.ID]: string | null; - [ECalloutAttributeNames.LOGO_IN_USE]: "emoji" | "icon"; + [ECalloutAttributeNames.LOGO_IN_USE]: "emoji" | "icon" | "none"; [ECalloutAttributeNames.BACKGROUND]: string | undefined; [ECalloutAttributeNames.BLOCK_TYPE]: "callout-component"; } & TCalloutBlockIconAttributes &