> ## Documentation Index
> Fetch the complete documentation index at: https://learn.nextedy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Supported Field and Entity Types

> Which Siemens Polarion ALM field types and entity types Nextedy POWERSHEET can edit, which it shows read-only, and which it can show only through a server-rendered column.

This page answers two questions in one place: can Powersheet show a given kind of Polarion data, and can a user edit it in the sheet? Every field type and entity type below has one of four support levels:

<table>
  <colgroup>
    <col width="201" />

    <col width="510" />
  </colgroup>

  <thead>
    <tr>
      <th>Support level</th>
      <th>Meaning</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>**Editable**</td>
      <td>Bound to the entity, edited in the sheet, and saved back to Polarion.</td>
    </tr>

    <tr>
      <td>**Editable, with caveats**</td>
      <td>Editable, but the cell shows or saves the value differently from Polarion. The notes say how.</td>
    </tr>

    <tr>
      <td>**Read-only**</td>
      <td>Loaded as a real value — it can be sorted, filtered, styled and used in expressions — but it cannot be changed in the sheet.</td>
    </tr>

    <tr>
      <td>**Server render only**</td>
      <td>Cannot be bound as a property. A [server-rendered property](/powersheet/guides/server-rendering/create-computed-property.md) shows it read-only.</td>
    </tr>
  </tbody>
</table>

## Which Fields Can Be Bound

A field becomes a column once the data model lists it under the entity type's `properties` and a column in the sheet configuration binds to it. Only the fields the data model lists are loaded.

**The rule:** Powersheet binds primitive fields and single-value enums — including enums over Polarion objects such as `@user`, `@document`, `@project` and `@plan`. It cannot bind a field that Polarion stores as an object reference, as a structure, or as a multi-value enum.

> [!WARNING]
>
> **An unsupported field stops the sheet from opening**
>
> Listing an object-reference or structure field under `properties` — `author`, `categories`, `hyperlinks` or a table field, for example — makes the sheet show "The sheet could not be initialised". A multi-value enum fails when the sheet loads its data. Neither falls back to a read-only column, and declaring the property with `type: string`, `type: enum` or a `serverName` alias does not help: the field's Polarion type always wins. To show such a field, add a server-rendered property under a **name of your own** and read the field inside the template.

Read-only is enforced by the server, not just by the sheet: a change to a read-only property is refused with the message `Cannot modify property '<Type>.<property>' as it has 'updatable' set to false`. Editable fields behave the same at every level of a sheet.

## Custom Field Types

| Polarion custom field type | Support | Notes |
| - | - | - |
| **String** | Editable | |
| **Text (plain, multi-line)** | Editable | In the cell editor, Alt+Enter adds a line break. Enter and Shift+Enter finish the edit. |
| **Rich text** | Editable, with caveats | Shown as plain text, and editing converts the field to plain text. See [Rich Text Fields](#rich-text-fields). |
| **Integer, Currency** | Editable | |
| **Float** | Editable | Displayed with two decimal places. |
| **Date** | Editable | Date picker. |
| **Date-time** | Editable, with caveats | The cell shows the date only, never the time. The editor has a date and a time picker, and changing the date keeps the time. |
| **Time** | Read-only | Shown as the stored text, for example `08:15:00.000 +0100`. |
| **Duration** | Editable | Typed as free text, for example `2d` or `1/2d`. The cell does not validate it. |
| **Boolean** | Editable, with caveats | Shown as the text `true` or `false`, not as a checkbox. An unset value also shows `false`. |
| **Enum, single value** | Editable | Dropdown with the enum's options. |
| **Enum over users (**`@user`**), single value** | Editable | Dropdown of all users by display name. Stores the user ID. |
| **Enum over documents (**`@document`**), projects (**`@project`**) or plans (**`@plan`**), single value** | Editable | Dropdown of the project's documents, the server's projects, or the project's plans. Stores the object's ID. |
| **Enum, multiple values — including** `@user` | Server render only | See [Users, Categories and Planning](#users-categories-and-planning). |
| **Table** | Server render only | See [Table Fields and Test Steps](#table-fields-and-test-steps). |
| **Test Steps** | Server render only | See [Table Fields and Test Steps](#table-fields-and-test-steps). |

## Built-In Work Item Fields

| Field | Support | Notes |
| - | - | - |
| `title` | Editable | |
| `priority`, `severity`, `resolution` | Editable | Dropdown. |
| `dueDate`, `resolvedOn` | Editable | |
| `initialEstimate`, `remainingEstimate`, `timeSpent` | Editable | Typed as free text durations. |
| `description` | Editable, with caveats | Same as a rich text custom field. See [Rich Text Fields](#rich-text-fields). |
| `status` | Read-only | A sheet cannot move a work item through its workflow. |
| `plannedStart`, `plannedEnd` | Read-only | Calculated by Polarion planning. |
| `id`, `created`, `updated`, `outlineNumber` | Read-only | |
| `author`, `assignee` | Server render only | See [Users, Categories and Planning](#users-categories-and-planning). |
| `categories` | Server render only | See [Users, Categories and Planning](#users-categories-and-planning). |
| `plannedIn`, `timePoint` | Server render only | See [Users, Categories and Planning](#users-categories-and-planning). |
| `hyperlinks`, `approvals`, `comments`, `linkedRevisions` | Server render only | See [Templates for Fields Powersheet Cannot Bind](#templates-for-fields-powersheet-cannot-bind). |
| `attachments` | Server render only | See [Attachments](#attachments). |
| `linkedOslcResources` | Server render only | See [OSLC Links](#oslc-links). |
| `externallyLinkedWorkItems` | Server render only | |
| Links between work items | Editable | Not a property but a relationship: its column picks, adds and removes linked items, and saving writes the links to Polarion. See [Relationships](/powersheet/reference/data-model/relationships.md) and [Configure Multi-Item Column](/powersheet/guides/sheet-configuration/configure-multi-item-column.md). |

### Rich Text Fields

A rich text field — the built-in `description`, or a custom field of rich text type — shows in the cell as **plain text**: bold, italics, lists, links, tables and images are not shown.

**Editing the cell converts the field to plain text, and the original formatting is lost for good.** Line breaks entered with Alt+Enter survive and show as line breaks in Polarion. Nothing else is interpreted: markup such as `**bold**` or `* bullet` appears literally, in the sheet and in Polarion.

A rich text field that nobody edits is safe. Saving other cells of the same row does not touch it, because a save sends only the properties the user changed.

To show rich text with its formatting, and to keep it safe from edits, show it through a server-rendered property and keep any column bound to the field itself read-only — `isReadOnly: true` on the column or `updatable: false` on the property. See [Configure Read-Only Column](/powersheet/guides/sheet-configuration/configure-read-only-column.md).

```yaml theme={null}
# Data model, under the entity type's properties
descriptionFormatted:
  serverRender: "$item.fields().get('description').render().htmlFor().forFrame()"
  readable: true
  updatable: false
```

```yaml theme={null}
# Sheet configuration
columns:
  descriptionFormatted:
    title: "Description"
    isReadOnly: true
    render: "() => context.value"
```

For a rich text custom field, replace `description` with the field's ID.

### Users, Categories and Planning

The built-in `author`, `assignee`, `categories`, `plannedIn` and `timePoint` fields, and multi-value enums, are shown through a server-rendered property. The templates are in [Templates for Fields Powersheet Cannot Bind](#templates-for-fields-powersheet-cannot-bind).

Where a user needs to **edit** the value in the sheet, use a single-value custom enum field instead:

* **A person** — a custom field of type `@user` enum is editable: the sheet shows a dropdown of all users and stores the user ID.
* **A plan** — a custom field of type `@plan` enum is editable and lists the project's plans. It is a separate field, not `plannedIn`: selecting a plan in it does **not** add the work item to that plan.

`plannedIn` cannot be written from a work item in any case: Polarion keeps the plan's work items on the plan, not on the work item.

### Table Fields and Test Steps

A table custom field cannot be bound, and neither can the steps of a test case. Both can be rendered as an HTML table.

For a table custom field, replace `myTable` with the field's ID:

```yaml theme={null}
# Data model, under the entity type's properties
myTableRendered:
  serverRender: "#set($t = $wi.getValue('myTable'))#if($t && $t.rows)<table>#foreach($r in $t.rows)<tr>#foreach($v in $r.values)<td>$!{v.content}</td>#end</tr>#end</table>#end"
  readable: true
  updatable: false
```

For the steps of a test case, replace `testSteps` with the ID of the test case type's test steps field. The column headers come from `.keys` and the rows from `.steps`:

```yaml theme={null}
# Data model, under the test case type's properties
testStepsTable:
  serverRender: "#set($t = $wi.getValue('testSteps'))#if($t && $t.steps && $t.steps.size() > 0)<table><tr>#foreach($k in $t.keys)<th>$!{k.name}</th>#end</tr>#foreach($s in $t.steps)<tr>#foreach($v in $s.values)<td>$!{v.content}</td>#end</tr>#end</table>#end"
  readable: true
  updatable: false
```

In the sheet configuration, keep the column read-only and render the HTML the property returns:

```yaml theme={null}
columns:
  testStepsTable:
    title: "Test Steps"
    width: 400
    isReadOnly: true
    render: "() => context.value"
```

### Attachments

A server-rendered property lists a work item's attachments as links, each with Polarion's file-type icon, and shows image attachments as thumbnails:

```yaml theme={null}
attachmentList:
  serverRender: "#foreach($a in $item.fields().attachments().iterator())#set($u = $a.fields().url().linkToOpen().toEncodedRelativeUrl(''))#set($n = $a.fields().fileName().get().toLowerCase())<div>#if($n.endsWith('.png') || $n.endsWith('.jpg') || $n.endsWith('.jpeg') || $n.endsWith('.gif') || $n.endsWith('.svg'))<img src='$u' style='max-width:140px;max-height:80px;display:block'/>#end<a target='_blank' href='$u'>$a.render().htmlFor().forFrame()</a></div>#end"
  readable: true
  updatable: false
```

The column needs `render: "() => context.value"`.

**Clicking an attachment link downloads the file; it does not open a preview.** Polarion serves attachments as downloads, and a link cannot change that. Images are the exception the template uses: an image shown in the cell renders inline, so the thumbnail is the preview.

### OSLC Links

`linkedOslcResources` — links to items in other tools, such as Jira or IBM DOORS Next, made through Polarion's Linked Data — cannot be bound, but a server-rendered property lists them as clickable links with their label and role:

```yaml theme={null}
oslcLinks:
  serverRender: |
    #foreach($l in $wi.getLinkedOslcResourcesStructs())<div><a href="$l.getURI()" target="_blank">$!l.getLabel()</a> <span style="color:#888">($l.getLinkRole().getName(), $l.getURI().getHost())</span></div>#end
  readable: true
  updatable: false
```

The column needs `render: "() => context.value"`. The template reads the links Polarion already stores and makes no call to the remote tool.

* **Fields of the remote item** — its title or status in Jira, for example — are not available.
* **Creating OSLC links** from the sheet is not supported.

## Server Render Is the General Fallback

**If Powersheet cannot edit a kind of data, it can usually still show it.** A server-rendered property runs a Velocity template on the server for every row the sheet loads. The template has the row's work item, its document and the Polarion platform services at hand, so anything those can reach — users, categories, plans, table fields, hyperlinks, approvals, OSLC links — can be rendered into a read-only column, as plain text or as HTML.

A server-rendered column behaves like any other column in the sheet:

<table>
  <colgroup>
    <col width="145" />

    <col width="568" />
  </colgroup>

  <thead>
    <tr>
      <th>Capability</th>
      <th>Behaviour</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>**Sort**</td>
      <td>Sorts on the rendered text. Empty values sort first in ascending order.</td>
    </tr>

    <tr>
      <td>**Filter by value**</td>
      <td>Lists each distinct rendered text. A cell that renders several names, such as `Steve Developer, Melanie Test`, is one value.</td>
    </tr>

    <tr>
      <td>**Export to Excel**</td>
      <td>Exported as plain text. HTML is flattened: a table becomes one line per row with the cells joined by `|`, and a link becomes its text.</td>
    </tr>

    <tr>
      <td>**HTML output**</td>
      <td>Shown as HTML when the column sets `render: "() => context.value"`. Without it, the HTML tags show as text.</td>
    </tr>
  </tbody>
</table>

What it costs:

* **The column is always read-only.** The value is recomputed from the template on every load and is never saved back. Give the property `readable: true` and `updatable: false`, and the column `isReadOnly: true`.
* **The template runs once per loaded row.** A template that runs queries or walks many links slows the loading of a large sheet.
* **A failing template shows `#SERVER_RENDER_ERROR`** in the cell instead of a value. See [Velocity Pitfalls](#velocity-pitfalls) and [Debug Template Errors](/powersheet/guides/server-rendering/debug-template-errors.md).

Ready-to-use templates for the fields that cannot be bound are in [Templates for Fields Powersheet Cannot Bind](#templates-for-fields-powersheet-cannot-bind).

## Templates for Fields Powersheet Cannot Bind

Each template goes under the entity type's `properties` in the data model, under a name of your own. Give every one `readable: true` and `updatable: false`, and its column `isReadOnly: true`. A template that outputs HTML also needs `render: "() => context.value"` on its column.

```yaml theme={null}
authorName:
  serverRender: "#set($u = $wi.author)#if($u)#if($u.unresolvable)$u.id#else$!u.name#end#end"
assigneeNames:
  serverRender: "#set($sep = '')#foreach($u in $wi.assignees)$sep#if($u.unresolvable)$u.id#else$!u.name#end#set($sep = ', ')#end"
categoryNames:
  serverRender: "#set($sep = '')#foreach($c in $wi.categories)$sep$!{c.name}#set($sep = ', ')#end"
reviewerNames:            # any multi-value enum custom field, @user included
  serverRender: "#set($sep = '')#foreach($o in $!wi.getCustomField('reviewers'))$sep$!{o.name}#set($sep = ', ')#end"
plannedInNames:
  serverRender: "#set($sep = '')#foreach($p in $wi.plannedIn)$sep$!{p.name}#set($sep = ', ')#end"
timePointName:
  serverRender: "#if($wi.timePoint)$!{wi.timePoint.name}#end"
hyperlinkList:            # HTML
  serverRender: "#foreach($h in $wi.hyperlinks)<div><a href='$h.uri' target='_blank'>$h.uri</a> ($!{h.role.name})</div>#end"
approvalList:
  serverRender: "#set($sep = '')#foreach($a in $wi.approvals)$sep$!{a.user.name}: $!{a.status.name}#set($sep = ', ')#end"
commentCount:
  serverRender: "$wi.comments.size()"
revisionCount:
  serverRender: "$wi.linkedRevisions.size()"
```

Replace `reviewers` with the ID of your multi-value enum field.

### Velocity Pitfalls

Polarion runs Velocity 1.x. These mistakes are easy to make and hard to spot:

| Pitfall | Symptom | Fix |
| - | - | - |
| `$foreach.hasNext` does not exist in Velocity 1.x | No separator: the names run together | Use a separator variable: `#set($sep = '')…$sep…#set($sep = ', ')` |
| `.name` on a user who does not exist on the server, for example after a project copy | `#SERVER_RENDER_ERROR` | Check first: `#if($u.unresolvable)$u.id#else$!u.name#end` |
| A reference directly followed by a directive, such as `$!c.name#set(…)` | `#set(…)` is printed as text | Use the braced form: `$!{c.name}#set(…)` |
| `#set($o = $wi.getCustomField('x'))` inside a loop, when the field is empty | `$o` keeps the previous iteration's value, because Velocity does not assign null | Reset the variable before each `#set`, or test the field first |

## Entity Types

An entity type is a kind of row a sheet can hold. The data model declares it under `domainModelTypes`.

| Entity type | Support | Notes |
| - | - | - |
| Work items of any type, including headings | Editable | Created, edited, linked and deleted in the sheet, within the user's Polarion permissions and the data model's [permissions](/powersheet/reference/data-model/permissions.md). One entity type can span several Polarion work item types. See [Data Model Types](/powersheet/reference/data-model/domainmodeltypes.md). |
| Documents | Read-only | Give rows access to the properties of the document they live in, for filtering, constraints and columns. A new work item can be routed into a chosen document when it is created — see [Document Rules](/powersheet/concepts/document-rules.md#create-stage) — but an existing work item cannot be moved to another document. See [Built-in Entity Types](/powersheet/reference/data-model/domainmodeltypes.md#built-in-entity-types). |
| Project | Read-only | See [Built-in Entity Types](/powersheet/reference/data-model/domainmodeltypes.md#built-in-entity-types). |
| Test records, and the test runs that hold them | Read-only | Loaded beneath their test case, newest first. See [Test Records](/powersheet/concepts/test-records.md). |
| Test steps | Server render only | Not rows: render them into a column of the test case. See [Table Fields and Test Steps](#table-fields-and-test-steps). |
| Plans, users and categories as rows | Server render only | Not rows: render them into a column of the work item. See [Users, Categories and Planning](#users-categories-and-planning). |

Baselines, revisions and collections are not rows either, but a whole sheet can read from them: see [Baseline and Revision Queries](/powersheet/reference/query-api/baseline-and-revision-queries.md) and [Collection-Scoped Sheets](/powersheet/concepts/collection-scoped-sheets.md).

## See Also

* [Type Conversion](/powersheet/reference/field-types/type-conversion.md) — how each Polarion field type maps to a Powersheet data type
* [Create a Computed Property](/powersheet/guides/server-rendering/create-computed-property.md) — set up a server-rendered property step by step
* [Use Velocity Templates](/powersheet/guides/server-rendering/use-velocity-template.md) — write the template behind a server-rendered property
* [Export to Excel](/powersheet/guides/export/export-to-excel.md#how-field-types-are-exported) — how each field type appears in the exported file
* [Test Records](/powersheet/concepts/test-records.md) — the read-only entity type for test results
* [Powersheet vs. Risksheet](/powersheet/concepts/powersheet-vs-risksheet.md) — how the two products compare, feature by feature


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.