diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index f8baa912..d8d2d33b 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -583,8 +583,16 @@ if(n<200&&document.readyState==="loading")requestAnimationFrame(function(){bar(n ], }, { text: "Wiki", link: "/core-concepts/pages/wiki" }, - { text: "Collections", link: "/pages/collections" }, - { text: "Nested Pages", link: "/core-concepts/pages/nested-pages" }, + { + text: "Organize pages", + collapsed: false, + link: "/pages/organize-pages", + items: [ + { text: "Collections", link: "/pages/collections" }, + { text: "Nested Pages", link: "/pages/nested-pages" }, + { text: "Page Labels", link: "/pages/page-labels" }, + ], + }, { text: "Page Templates", link: "/templates/page-templates" }, ], }, @@ -724,6 +732,7 @@ if(n<200&&document.readyState==="loading")requestAnimationFrame(function(){bar(n text: "AI", items: [ { text: "Plane AI", link: "/ai/plane-ai" }, + { text: "AI Skills", link: "/ai/ai-skills" }, { text: "AI credits", link: "/ai/plane-ai-credits" }, { text: "MCP Connectors", link: "/ai/mcp-connectors" }, { diff --git a/docs/ai/ai-skills.md b/docs/ai/ai-skills.md new file mode 100644 index 00000000..82206058 --- /dev/null +++ b/docs/ai/ai-skills.md @@ -0,0 +1,90 @@ +--- +title: AI Skills +sidebar_label: AI Skills +description: Save reusable instructions for Plane AI and run them as slash commands in chat. +--- + +# AI Skills + +AI Skills are reusable instructions you save once and run in Plane AI chat with a slash command. Instead of retyping a detailed prompt every time, you capture it as a skill, give it a name, and invoke it with `/name` whenever you need it. Skills can include variables so a single skill adapts to different work items, projects, or people each time you run it. + +:::info Requirement +AI Skills are part of Plane AI and are available when Plane AI is enabled for your workspace. +::: + +## Skill scopes + +Every skill has a scope that determines who can use it. + +| Scope | Who creates it | Who can use it | +| ------------- | ----------------- | ---------------------------- | +| **Personal** | Any member | Only you | +| **Workspace** | A workspace admin | Everyone in the workspace | +| **System** | Built into Plane | Everyone, in every workspace | + +Personal and workspace skills are the ones you create. System skills are built-in and ready to use; they cannot be edited or deleted. + +## Find your skills + +Open **Skills** from the Plane AI sidebar. The page has two tabs + +- **Personal** - the skills only you can use. +- **Workspace level** - the skills shared across the workspace. + +Each skill is listed with its name and who created it, along with **Edit** and **Delete** actions. + +## Create a skill + +1. On the Skills page, click **Add new skill** (or **Add personal skill** / **Add workspace skill**). +2. Fill in the form. + - **Skill name** (required) + The name becomes the skill's slash command. Use lowercase words separated by hyphens, for example `weekly-update`. In chat you will run it as `/weekly-update`. The name is shown with a leading `/` in the form to make this clear. + + - **Description** (optional) + A short summary of what the skill does, so you and your teammates can tell skills apart in the list. + + - **Scope** + Choose **Personal** (only you can use it) or **Workspace** (anyone in the workspace can use it). The Workspace option is available only to workspace admins. + + - **Instructions** (required) + The prompt Plane AI runs when the skill is invoked. Write it as clear instructions describing what you want done. You can include variables (see below). + +3. Click **Save**. + +## Use variables + +Variables let one skill handle different inputs each time it runs. Write a variable `{{ variable_name }}` anywhere in the instructions, for example: + +``` +Summarize the latest activity on {{ work_item }} and post a status update for {{ assignee }}. +``` + +When you run the skill, you supply the specific value for each variable. + +Two ways to add a variable in the editor: + +- Type `{{ }}` directly and name your own variable. +- Click **Add variable**, or press `{`, to insert a Plane entity variable. The available Plane entities are: work item, project, workspace, initiative, cycle, module, view, teamspace, page, assignee, priority, due date, and state. + +Plane detects the variables in your instructions automatically. You do not declare them separately. + +## Run a skill in chat + +1. In the Plane AI chat input, type `/`. +2. A list of your available skills appears (personal, workspace, and system). Keep typing to filter by name. +3. Select the skill. Its instructions are added to your message. +4. Provide values for any variables the skill uses, then send. + +The skill list also includes a **Manage skills** shortcut back to the Skills page. + +## Edit or delete a skill + +From the Skills page, use the **Edit** action to change a skill's name, description, scope, or instructions, and **Delete** to remove it. Deleting a skill cannot be undone. + +You can edit and delete your own personal skills. Editing and deleting workspace skills requires workspace admin access. System skills cannot be changed. + +## Notes + +- A skill name must be unique within its scope: unique among your personal skills, unique within the workspace for workspace skills. +- Instructions can be up to 8,000 characters. +- Deactivating or deleting a skill removes it from the slash command list going forward; it does not affect past chats. diff --git a/docs/core-concepts/issues/plane-query-language.md b/docs/core-concepts/issues/plane-query-language.md index 7c94be09..b827d69d 100644 --- a/docs/core-concepts/issues/plane-query-language.md +++ b/docs/core-concepts/issues/plane-query-language.md @@ -24,6 +24,32 @@ When you start typing in the PQL field: This guided experience lets you construct queries without memorizing syntax. +## Generate a filter with AI + +Instead of writing PQL by hand, you can describe the filter you want in plain language and let Plane AI translate it into a PQL query for you. + +In the advanced (PQL) filter view, look for the AI filter input with the prompt **"Describe your filter in plain language..."** + +1. Type what you want in natural language, for example "high priority bugs assigned to me that are overdue." +2. Press **Enter**, or click the submit button. +3. Plane AI generates the matching PQL query, fills it into the PQL editor, and applies it. + +The generated query appears in the PQL editor as normal PQL, so you can review it, tweak it by hand, and save it as a view like any other query. + +### Examples + +| You type | Plane AI produces a query like | +| ----------------------------------------------- | ---------------------------------------------------------------------------- | +| "urgent items with no assignee" | `priority = Urgent AND hasNoAssignee()` | +| "everything due this week in the current cycle" | `dueDate BETWEEN startOfWeek() AND endOfWeek() AND cycle IN (activeCycle())` | +| "bugs Priya is working on that aren't done" | `type = Bug AND assignee = Priya AND stateGroup IN (openStates())` | + +When your description names people, cycles, labels, or other entities, Plane AI resolves them to the actual items in your workspace so the query filters correctly and reads with their real names. If you are filtering inside a project, the AI scopes the query to that project. Otherwise it generates a workspace-level query. + +If your description is too ambiguous or can't be turned into a valid filter, you'll see "Could not generate a PQL query from the given input." Try rephrasing with more specific terms, or build the filter manually. + +Generating filters with AI requires [Plane AI to be enabled](/ai/plane-ai#enable-plane-ai-for-a-workspace) for your workspace. + ## Query structure PQL queries follow a simple pattern: @@ -138,13 +164,46 @@ Use `text` when you want to match a term whether it appears in the title or the Each field supports different operators. The available operators depend on the field type. +All operators available in PQL: + +| Operator | Meaning | +| ------------- | -------------------------------------- | +| `=` | Matches exactly | +| `!=` | Does not match | +| `~` | Contains the text | +| `IN` | Matches any value in a set | +| `NOT IN` | Matches none of the values in a set | +| `<` | Less than / before | +| `<=` | Less than or equal to / on or before | +| `>` | Greater than / after | +| `>=` | Greater than or equal to / on or after | +| `BETWEEN` | Within a range | +| `IS NULL` | The field has no value | +| `IS NOT NULL` | The field has a value | + +The tables below show which operators apply to each field. + ### id -| Operator | Description | -| -------- | ------------------ | -| `=` | ID matches exactly | -| `!=` | ID does not match | -| `~` | ID contains text | +The `id` field matches a work item by its identifier (like `WEB-11`) or by its sequence number, and it supports comparisons as well as exact matches. + +| Operator | Description | +| ----------------- | ------------------------------------------------- | +| `=` | ID matches exactly | +| `!=` | ID does not match | +| `~` | Identifier contains text (partial match) | +| `<` `<=` `>` `>=` | Sequence comparison | +| `BETWEEN` | Sequence within a range | +| `IN` | Any of the listed identifiers or sequence numbers | + +The value can take several forms: + +| Form | Meaning | Example | +| --------------------- | --------------------------------------------- | ----------------------------------------------------------------- | +| Identifier equality | Exact work item key | `id = "WEB-11"` | +| Identifier comparison | Project-scoped sequence comparison | `id >= "WEB-11"` matches project `WEB` with sequence 11 or higher | +| Bare integer | Sequence number only, in any project in scope | `id >= 10`, `id IN (1, 2, 3)` | +| Contains | Partial identifier match | `id ~ "WEB"` | ### title @@ -191,13 +250,14 @@ Each field supports different operators. The available operators depend on the f ### assignee -| Operator | Description | -| --------- | -------------------------------------------- | -| `IN` | Assigned to any of the specified members | -| `NOT IN` | Not assigned to any of the specified members | -| `=` | Assigned to this member | -| `!=` | Not assigned to this member | -| `IS NULL` | No assignee | +| Operator | Description | +| ------------- | -------------------------------------------- | +| `IN` | Assigned to any of the specified members | +| `NOT IN` | Not assigned to any of the specified members | +| `=` | Assigned to this member | +| `!=` | Not assigned to this member | +| `IS NULL` | No assignee | +| `IS NOT NULL` | Has an assignee | ### priority @@ -210,105 +270,76 @@ Each field supports different operators. The available operators depend on the f ### mention -| Operator | Description | -| --------- | --------------------------------------------- | -| `IN` | Mentions any of the specified members | -| `NOT IN` | Does not mention any of the specified members | -| `=` | Mentions this member | -| `!=` | Does not mention this member | -| `IS NULL` | No mentions | +| Operator | Description | +| ------------- | --------------------------------------------- | +| `IN` | Mentions any of the specified members | +| `NOT IN` | Does not mention any of the specified members | +| `=` | Mentions this member | +| `!=` | Does not mention this member | +| `IS NULL` | No mentions | +| `IS NOT NULL` | Has mentions | ### label -| Operator | Description | -| --------- | ----------------------------------------- | -| `IN` | Has any of the specified labels | -| `NOT IN` | Does not have any of the specified labels | -| `=` | Has this label | -| `!=` | Does not have this label | -| `IS NULL` | No labels | +| Operator | Description | +| ------------- | ----------------------------------------- | +| `IN` | Has any of the specified labels | +| `NOT IN` | Does not have any of the specified labels | +| `=` | Has this label | +| `!=` | Does not have this label | +| `IS NULL` | No labels | +| `IS NOT NULL` | Has at least one label | ### cycle -| Operator | Description | -| --------- | ---------------------------------- | -| `IN` | In any of the specified cycles | -| `NOT IN` | Not in any of the specified cycles | -| `=` | In this cycle | -| `!=` | Not in this cycle | -| `IS NULL` | Not in any cycle | +| Operator | Description | +| ------------- | ---------------------------------- | +| `IN` | In any of the specified cycles | +| `NOT IN` | Not in any of the specified cycles | +| `=` | In this cycle | +| `!=` | Not in this cycle | +| `IS NULL` | Not in any cycle | +| `IS NOT NULL` | In a cycle | ### module -| Operator | Description | -| --------- | ----------------------------------- | -| `IN` | In any of the specified modules | -| `NOT IN` | Not in any of the specified modules | -| `=` | In this module | -| `!=` | Not in this module | -| `IS NULL` | Not in any module | +| Operator | Description | +| ------------- | ----------------------------------- | +| `IN` | In any of the specified modules | +| `NOT IN` | Not in any of the specified modules | +| `=` | In this module | +| `!=` | Not in this module | +| `IS NULL` | Not in any module | +| `IS NOT NULL` | In a module | ### milestone -| Operator | Description | -| --------- | -------------------------------------- | -| `IN` | In any of the specified milestones | -| `NOT IN` | Not in any of the specified milestones | -| `=` | In this milestone | -| `!=` | Not in this milestone | -| `IS NULL` | No milestone | - -### startDate - -| Operator | Description | -| --------- | ---------------------------------------- | -| `=` | Start date is this date | -| `!=` | Start date is not this date | -| `<` | Start date is before this date | -| `<=` | Start date is on or before this date | -| `>` | Start date is after this date | -| `>=` | Start date is on or after this date | -| `BETWEEN` | Start date is within the specified range | -| `IS NULL` | No start date set | - -### dueDate - -| Operator | Description | -| --------- | -------------------------------------- | -| `=` | Due date is this date | -| `!=` | Due date is not this date | -| `<` | Due date is before this date | -| `<=` | Due date is on or before this date | -| `>` | Due date is after this date | -| `>=` | Due date is on or after this date | -| `BETWEEN` | Due date is within the specified range | -| `IS NULL` | No due date set | - -### createdAt - -| Operator | Description | -| --------- | ---------------------------------- | -| `=` | Created on this date | -| `!=` | Not created on this date | -| `<` | Created before this date | -| `<=` | Created on or before this date | -| `>` | Created after this date | -| `>=` | Created on or after this date | -| `BETWEEN` | Created within the specified range | -| `IS NULL` | No creation date | - -### updatedAt - -| Operator | Description | -| --------- | ---------------------------------- | -| `=` | Updated on this date | -| `!=` | Not updated on this date | -| `<` | Updated before this date | -| `<=` | Updated on or before this date | -| `>` | Updated after this date | -| `>=` | Updated on or after this date | -| `BETWEEN` | Updated within the specified range | -| `IS NULL` | No update date | +| Operator | Description | +| ------------- | -------------------------------------- | +| `IN` | In any of the specified milestones | +| `NOT IN` | Not in any of the specified milestones | +| `=` | In this milestone | +| `!=` | Not in this milestone | +| `IS NULL` | No milestone | +| `IS NOT NULL` | Has a milestone | + +### startDate, dueDate, createdAt, updatedAt + +Date fields all support the same operators. + +| Operator | Description | +| ------------- | -------------------------- | +| `=` | Is this date | +| `!=` | Is not this date | +| `<` | Before this date | +| `<=` | On or before this date | +| `>` | After this date | +| `>=` | On or after this date | +| `BETWEEN` | Within the specified range | +| `IS NULL` | No date set | +| `IS NOT NULL` | A date is set | + +Date values can be literal dates or [date functions](#date-functions), for example `dueDate < today()` or `createdAt >= daysAgo(7)`. ### createdBy @@ -396,35 +427,137 @@ The available operators depend on the property type. PQL includes functions that cover common scenarios. Type `(` after a field, or start typing a function name, and the editor suggests the ones that fit. -### Predicate functions +Functions come in two kinds: + +- **Value functions** return a value or a list. You use them inside a condition, on the right side of a comparison or with `IN`. +- **Condition functions** are standalone true/false checks. You use them on their own and combine them with `AND`, `OR`, and `NOT`. + +## Value functions + +### Date functions + +Return a date. Use them on the right side of a date-field condition. + +| Function | Returns | +| ----------------------------------- | ----------------------------- | +| `now()` / `today()` | Today's date | +| `startOfDay()` / `endOfDay()` | Start / end of today | +| `startOfWeek()` / `endOfWeek()` | Start / end of this week | +| `startOfMonth()` / `endOfMonth()` | Start / end of this month | +| `startOfYear()` / `endOfYear()` | Start / end of this year | +| `daysAgo(n)` / `daysFromNow(n)` | n days before / after today | +| `weeksAgo(n)` / `weeksFromNow(n)` | n weeks before / after today | +| `monthsAgo(n)` / `monthsFromNow(n)` | n months before / after today | + +Examples: + +``` +dueDate BETWEEN startOfWeek() AND endOfWeek() +createdAt >= daysAgo(7) +``` + +### User functions -These are standalone conditions that return true or false. Use them on their own (and combine with `NOT` to invert). +| Function | Returns | +| ----------------- | ----------------------------- | +| `currentUser()` | The person running the query | +| `inactiveUsers()` | Deactivated workspace members | -| Function | Matches work items that | -| ----------------------- | -------------------------------------- | -| `isOverdue()` | Are past their due date and still open | -| `hasNoAssignee()` | Have no assignee | -| `hasNoLabel()` | Have no labels | -| `isTopLevel()` | Are not a sub-work item (no parent) | -| `isSubWorkItem()` | Are a sub-work item (have a parent) | -| `hasChildren()` | Have at least one sub-work item | -| `hasStartAndDueDates()` | Have both a start date and a due date | +Examples: -### Relation functions +``` +assignee = currentUser() +assignee IN (inactiveUsers()) +``` + +### Cycle functions + +Return a list of cycles. Use them with `IN`. + +| Function | Returns | +| ------------------- | ---------------------------------------- | +| `activeCycle()` | The cycle active today | +| `completedCycles()` | Cycles whose end date has passed | +| `upcomingCycles()` | Cycles whose start date is in the future | + +Example: + +``` +cycle IN (activeCycle()) +``` + +### State group functions -These match work items by their relationship to other work items. Each takes one or more work item identifiers (for example `PROJ-123`). +Return a list of state groups. Use them with `IN` on `stateGroup`. -| Function | Matches work items that | -| -------------------------- | --------------------------------------- | -| `blockedBy("PROJ-1", …)` | Are blocked by the given items | -| `blocks("PROJ-1", …)` | Block the given items | -| `linkedTo("PROJ-1", …)` | Are related to the given items | -| `duplicateOf("PROJ-1", …)` | Are marked duplicate of the given items | -| `childOf("PROJ-1", …)` | Are a child of the given items | -| `parentOf("PROJ-1", …)` | Are a parent of the given items | +| Function | Returns | +| ---------------- | -------------------------------------- | +| `openStates()` | Backlog, unstarted, and started groups | +| `closedStates()` | Completed and cancelled groups | +| `activeStates()` | Unstarted and started groups | Example: ``` -blockedBy("PROJ-42") +stateGroup IN (openStates()) ``` + +## Condition functions + +Standalone checks that return true or false. Combine them with `AND`, `OR`, and `NOT`. Arguments shown as `"user"`, `"date"`, `"text"`, or `n` are values you supply; you pick users and dates from the editor's suggestions. + +### Structure and relationships + +Relation functions each take one or more work item identifiers, for example `blockedBy("WEB-11", "WEB-20")`. + +| Function | Matches work items that | Example | +| ---------------------- | ----------------------------------------------- | ----------------------- | +| `isTopLevel()` | Are not a sub-work item (no parent) | `isTopLevel()` | +| `isSubWorkItem()` | Are a sub-work item (have a parent) | `isSubWorkItem()` | +| `hasChildren()` | Have at least one sub-work item | `hasChildren()` | +| `hasRelations()` | Have at least one relation to another work item | `hasRelations()` | +| `blockedBy("id", …)` | Are blocked by the given items | `blockedBy("WEB-11")` | +| `blocks("id", …)` | Block the given items | `blocks("WEB-11")` | +| `linkedTo("id", …)` | Are related to the given items | `linkedTo("WEB-11")` | +| `duplicateOf("id", …)` | Are marked duplicate of the given items | `duplicateOf("WEB-11")` | +| `childOf("id", …)` | Are a child of the given items | `childOf("WEB-11")` | +| `parentOf("id", …)` | Are a parent of the given items | `parentOf("WEB-11")` | + +### Assignees and labels + +| Function | Matches work items that | Example | +| ----------------- | ----------------------- | ----------------- | +| `hasNoAssignee()` | Have no assignee | `hasNoAssignee()` | +| `hasNoLabel()` | Have no labels | `hasNoLabel()` | + +### Dates and status + +| Function | Matches work items that | Example | +| ----------------------- | -------------------------------------- | ----------------------- | +| `isOverdue()` | Are past their due date and still open | `isOverdue()` | +| `hasStartAndDueDates()` | Have both a start date and a due date | `hasStartAndDueDates()` | + +### Comments, links, and attachments + +Count arguments accept a number or a comparison such as `">= 2"`. + +| Function | Matches work items that | Example | +| ------------------------- | ------------------------------------------------ | ------------------------------- | +| `hasComments([n])` | Have comments, optionally a count | `hasComments(">= 3")` | +| `commentedAfter("date")` | Have a comment on or after the date | `commentedAfter("2026-01-01")` | +| `commentedBefore("date")` | Have a comment on or before the date | `commentedBefore("2026-06-30")` | +| `commentContains("text")` | Have a comment containing the text | `commentContains("blocker")` | +| `lastCommentBy("user")` | Whose most recent comment is by the user | `lastCommentBy("Priya")` | +| `hasLinks([n])` | Have URL links, optionally a count | `hasLinks(">= 1")` | +| `linkContains("text")` | Have a link whose URL or title contains the text | `linkContains("figma")` | +| `hasAttachments([n])` | Have attachments, optionally a count | `hasAttachments(">= 2")` | +| `attachedBy("user")` | Have an attachment uploaded by the user | `attachedBy("Priya")` | + +### Worklogs and activity + +| Function | Matches work items that | Example | +| --------------------------------- | --------------------------------------- | ----------------------------------------------- | +| `hasWorklogs()` | Have at least one worklog (logged time) | `hasWorklogs()` | +| `workLoggedBy("user")` | Have time logged by the user | `workLoggedBy("Priya")` | +| `workLoggedBetween("from", "to")` | Have time logged between two dates | `workLoggedBetween("2026-01-01", "2026-01-31")` | +| `recentlyViewed()` | You viewed in the last 30 days | `recentlyViewed()` | diff --git a/docs/core-concepts/pages/editor-blocks.md b/docs/core-concepts/pages/editor-blocks.md index 23708ce2..cda8010d 100644 --- a/docs/core-concepts/pages/editor-blocks.md +++ b/docs/core-concepts/pages/editor-blocks.md @@ -198,6 +198,32 @@ Use the `/board` or `/drawio-board` slash command to insert a whiteboard block. Both modes feature a consistent toolbar with **Save** and **Exit** buttons, making it easy to preserve your work and return to your Page. All diagrams are fully interactive—simply click any saved diagram to edit it again. +## HTML artifact + +An HTML artifact embeds a self-contained HTML file as a live, interactive block inside a page. Instead of pasting a link or a screenshot, you upload an `.html` file and it renders inline, right where you put it. This is useful for embedding things like a prototype, a self-contained report, a chart exported as HTML, or any standalone web snippet. + +The rendered artifact is fully interactive: scripts in the file run, so buttons, tabs, and other in-page interactions work. + +Hover over the block to reveal its toolbar: + +- **Open in new tab** opens the artifact in its own browser tab. +- **View full screen** opens the artifact in a large modal for a closer look. +- **Replace file** (edit mode) swaps in a different HTML file, keeping the block in place. +- **Download** (edit mode) downloads the original HTML file. +- **Delete artifact** (edit mode) removes the block. + +**Resize:** in edit mode, drag the bottom edge of the block to change its height. The height is saved with the page. + +In read-only or published pages, the artifact still renders and stays interactive. Readers get the **Open in new tab** and **View full screen** actions, but not the edit-only controls (replace, download, delete, resize). + +HTML artifacts run in a sandboxed frame that is isolated from Plane. The embedded file can run its own scripts and open links, but it cannot access your Plane session, your workspace data, or the surrounding page. Treat an artifact like any embedded third-party web page: only embed files you trust. + +### Notes + +- Accepted file types are `.html` and `.htm` only. +- Deleting an artifact block also removes its uploaded file, unless the same file is embedded elsewhere in the page. +- HTML artifacts are available in pages and other rich text fields (such as work item descriptions), wherever the editor is used. + ## Callout Creates visually distinct sections with customizable icons and colors for highlighting warnings, tips , and calls-to-action. @@ -230,7 +256,7 @@ Adds a horizontal line to separate content sections visually. Add emojis to your content across all Plane editors. Type `/emoji` to open the picker or use `:` and start typing for suggestions like `:smile:`. Choose from standard Unicode emojis and GitHub's extended collection. -## Date block +## Date block The date block inserts an inline date picker anywhere in a page. It renders as a small pill showing a formatted date and can be clicked to open a calendar and change the selection. @@ -250,7 +276,7 @@ Click the pill again at any time to change the date. The date renders as plain formatted text. It cannot be clicked or changed. -## Status block +## Status block The status block inserts an inline colored label anywhere in a page. You define the text and choose from six colors. Use it to mark sections of a page with a state, flag, or category without creating a separate work item. diff --git a/docs/dashboards.md b/docs/dashboards.md index e3f9deff..1382c8d8 100644 --- a/docs/dashboards.md +++ b/docs/dashboards.md @@ -243,7 +243,7 @@ A two dimensional table renders issues grouped by the x-axis property as rows, w One row per group, with a count column. The y-axis metric is fixed to **work item count** and cannot be changed - table charts always show a raw count. The appearance settings (column color, legend, tooltip) match the bar chart config options. -### Work Items Table +### Work Items Table A work items table lists individual work items as rows with configurable columns. Unlike the table chart, which aggregates issues into groups and shows a count, the work items table renders one row per work item - giving you a live filtered spreadsheet view of your issues directly on a dashboard. @@ -300,7 +300,7 @@ Dashboard-level and widget-level filters still apply, narrowing your assigned it Because the widget resolves to the current viewer, it shows results only for a signed-in user. On a published (public) dashboard, where there is no signed-in viewer, it has nothing to resolve to and shows no items. -### Work items progress +### Work item type progress The work items progress widget shows progress broken down by work item type. Each row is a work item of the type or types you choose (for example, an Epic or any custom type), and its progress bar reflects the completion of that item's direct sub-items. diff --git a/docs/core-concepts/pages/nested-pages.md b/docs/pages/nested-pages.md similarity index 100% rename from docs/core-concepts/pages/nested-pages.md rename to docs/pages/nested-pages.md diff --git a/docs/pages/organize-pages.md b/docs/pages/organize-pages.md new file mode 100644 index 00000000..38a84540 --- /dev/null +++ b/docs/pages/organize-pages.md @@ -0,0 +1,61 @@ +--- +title: Organize pages +sidebar_label: Organize pages +description: Keep your pages tidy with favorites, moving, duplicating, archiving, and deleting. +--- + +# Organize pages + +As your pages grow, a few actions help you keep them organized and findable. This page covers the everyday actions you take on a single page. For the bigger organizing tools, see: + +- **[Nested pages](/pages/nested-pages)** - build a hierarchy of pages and sub-pages. +- **[Collections](/pages/collections)** - group wiki pages into folders, including private collections. +- **[Page labels](/pages/page-labels)** - tag pages and filter by label. + +You reach the actions below from a page's **options menu** (the **⋯** in the top-right of an open page), or by opening a page's actions menu from any page list. + +## Favorite a page + +Favoriting keeps a page one click away. Open the options menu and choose **Add to favorites**. Favorited pages appear in the **Favorites** view, and starred in your page lists, so the pages you return to most stay at hand. + +To remove one, choose **Remove from favorites**. + +Favorites are personal to you. Favoriting a page does not change who can see it or affect anyone else's view. + +## Move a page + +Moving relocates a page to a different place in your workspace. On the top right of a page, click the **Move page**con i, then pick a destination. + +Depending on where the page currently lives, you can move it to: + +- another **project**, +- a **teamspace**, +- the **workspace wiki**, or a specific **wiki collection**. + +Use the search box in the move dialog to find the destination, then confirm with **Move**. + +A few rules apply: + +- A page must be unlocked and not archived before it can be moved. +- **Private and shared pages cannot be moved to a teamspace.** Make the page public first, or choose a different destination. +- If you move a page to a wiki collection and it cannot be added to that collection, the page still moves to the wiki and lands in the default **General** collection. + +Moving a page brings its sub-pages with it, keeping the hierarchy intact. + +## Duplicate a page + +To create a copy of a page, open the options menu and choose **Make a copy**. Plane creates a new page with the same content, including any images and file attachments. The copy is independent: editing it does not affect the original. + +## Archive a page + +Archiving removes a page from your active lists without deleting it, so you can bring it back later. Open the options menu and choose **Archive**. Archived pages move to the **Archived** view for that scope. + +Archiving a page also archives its sub-pages. On the workspace wiki, archiving a page that is published to the web also unpublishes it. + +To bring a page back, open it from the Archived view and choose **Restore**. Restoring returns the page, and its sub-pages, to their previous place. + +## Delete a page + +Deleting removes a page permanently. A page must be **archived first**: the **Delete** action becomes available only from the Archived view. Open the archived page's options menu and choose **Delete**. + +Deleting is permanent and cannot be undone, so archive is the safer choice when you might want the page again. diff --git a/docs/pages/page-labels.md b/docs/pages/page-labels.md new file mode 100644 index 00000000..f5ddfc25 --- /dev/null +++ b/docs/pages/page-labels.md @@ -0,0 +1,38 @@ +--- +title: Page labels +sidebar_label: Page labels +description: Tag and organize wiki pages with workspace-level labels, and filter pages by label. +--- + +# Page Labels + +Page labels let you tag pages so you can categorize and find them. A label has a name and a color, and a page can carry as many labels as you need. Labels are shared across the workspace, so the same set is available on every page. + +## Apply labels to a page + +1. Open the page and go to its **info panel** in the navigation pane. +2. Open the **Labels** field. +3. Search for a label and select it. A page can have multiple labels; select as many as apply. + +Applied labels appear on the page with their color. To remove one, click the **x** on the label. + +### Create a label while tagging + +If the label you want does not exist yet, type its name in the labels search box and choose **Create "\"** at the bottom of the list. The new label is created with a color and applied to the page immediately. It then becomes available for every other page in the workspace. + +## How labels are scoped + +Labels are **workspace-level**. Creating a label once makes it available on all pages across the workspace, and label names are unique within a workspace, so you cannot create two labels with the same name. + +## Filter pages by label + +In the pages list, use the filters to narrow pages by label. This makes labels a quick way to pull up a set of related pages, for example everything tagged `runbook` or `RFC`. + +## Permissions + +Applying and removing labels on a page follows your edit access to that page. Managing the workspace's label set (creating, renaming, recoloring, and deleting labels) is governed by page label permissions in the workspace. + +## Notes + +- Deleting a label removes it from every page it was applied to. The pages themselves are not affected. +- A page's labels are independent of work item labels; page labels apply only to pages. diff --git a/docs/work-items/project-work-item-types.md b/docs/work-items/project-work-item-types.md index 653e5bfa..3b776034 100644 --- a/docs/work-items/project-work-item-types.md +++ b/docs/work-items/project-work-item-types.md @@ -116,6 +116,10 @@ A date picker field. You choose a display format for dates across this property: The format you pick applies consistently to all work items using this property. +### Rich text + +A full document editor field. Unlike a plain text property, rich text supports formatting: headings, lists, code blocks, inline code, bold, italic, and embedded images. Each work item stores its own content for the field, and that content is versioned and searchable. + ### Member picker A people-selection field that lists all members of the project. Choose **Single select** to allow one member, or **Multi select** to allow several. diff --git a/docs/work-items/workspace-work-item-types.md b/docs/work-items/workspace-work-item-types.md index ec77396d..86669e68 100644 --- a/docs/work-items/workspace-work-item-types.md +++ b/docs/work-items/workspace-work-item-types.md @@ -128,7 +128,7 @@ Members selected through a member picker property are automatically added as sub A field for linking a work item to one or more [releases](https://docs.plane.so/releases) in the project. Supports multi-select. -### Rich text +### Rich text A full document editor field. Unlike a plain text property, rich text supports formatting: headings, lists, code blocks, inline code, bold, italic, and embedded images. Each work item stores its own content for the field, and that content is versioned and searchable. diff --git a/vercel.json b/vercel.json index a6ffe51c..7e719b7a 100644 --- a/vercel.json +++ b/vercel.json @@ -296,6 +296,10 @@ { "source": "/ai/pi-chat", "destination": "/ai/plane-ai" + }, + { + "source": "/core-concepts/pages/nested-pages", + "destination": "/pages/nested-pages" } ], "rewrites": [