Example
Create a comment thread with a marker annotation.
const rootId = NutrientViewer.generateInstantId();
const marker = new NutrientViewer.Annotations.CommentMarkerAnnotation({
id: rootId,
pageIndex: 0,
boundingBox: new NutrientViewer.Geometry.Rect({
top: 50,
left: 50,
width: 20,
height: 20,
}),
});
const comment = new NutrientViewer.Comment({
pageIndex: 0,
rootId,
text: {
format: "plain",
value: "Please review this area.",
},
});
await instance.create([marker, comment]);
Hierarchy
Constructors
Parameters
Properties
canSetGroup
This property defines whether the user has permission to edit the group of this comment. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
createdBy
The ID of the user who created the comment, as determined by the
authenticated user (the user_id claim of the JWT) that created it.
You cannot change who is recorded as the author: the value is assigned by
the backend, and a locally set value is never sent. It is only available on
Server-Backed deployments, and is null for comments created without an
authenticated user, as well as when the server holds an author it can no
longer resolve to an upstream user id.
customData
Arbitrary JSON-serializable data the user can attach to the comment.
group
This property is used to define the permission scope for a particular comment.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
id
A unique identifier for the comment. When comment is created in the UI, the viewer has to generate a unique ID.
isDeletable
This property defines whether this comment can be deleted or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
isEditable
This property defines whether this comment can be edited or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
pdfObjectId
If this comment is from the original PDF, then this ID is from that PDF note annotation that defined the comment.
rootId
The ID of the annotation that this comment stems from. In Nutrient Web SDK, this should be either a NutrientViewer.Annotations.MarkupAnnotation or a NutrientViewer.Annotations.CommentMarkerAnnotation.
text
The text of the comment in xhtml/plain text format.
In case of XHTML, we support the following tags:
<b>: Bold<i>: Italic<span>: Font color, background color and underline using thestyleattribute (e.g.<span style="color: red; background-color: blue; text-decoration: underline">Hello</span>)p: Paragraph. You can use this to add a newline between paragraphs.a: Link. You can use this to add a link to the comment. Thehrefattribute is required.
| Property | Description |
|---|---|
| format | |
| value |
Methods
Returns the record's
[key, value]pairs, in the order its fields were defined.Returns
IterableIterator<[string, unknown]>An iterator over the record's fields.
A method that returns a set of user IDs that are mentioned in the comment.
Returns
NutrientViewer.Immutable.Set<string>An immutable set of user IDs that are mentioned in the comment.
Example
const ids = comment.getMentionedUserIds()
fromSerializableObject
Comment deserializer. Converts a comment object to a NutrientViewer.Comment.
Parameters
commentCommentJSONThe comment to deserialize.
Returns
The deserialized comment.
toSerializableObject
Comment serializer. Converts a comment to a InstantJSON compliant object.
Parameters
commentNutrientViewer.CommentThe comment to serialize.
Returns
The serialized comment.
Immutable Record API
27
Returns a record with every key reset to the default it was defined with.
Returns
thisA new record holding only default values.
delete<K extends keyof { … }>(
key: K & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
),
): thisReturns a record with
keyreset to the default it was defined with.Type Parameters
Kextends keyof { … }
Parameters
keyK & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
)One of the keys this record was defined with.
Returns
thisA new record, or this one when the value already equals the default.
Returns a record with the value at
keyPathremoved. A field of this record is reset to its default; a key of a nested collection or plain object is deleted.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
Returns
thisA new record, or this one when nothing was removed.
equals
Reports whether
otheris a record holding the same keys with equal values, whatever its class.Parameters
otherunknownThe value to compare against.
Returns
booleantruewhen both hold the same keys and every value matches.Deprecated
Records of different classes with identical values compare equal. Use
isEqual(), which also requires both records to be of the same class.
get<K extends keyof { … }, N = never>(
key: K & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
),
notSetValue?: N,
): N | { … }[K]Returns the value stored under
key.Type Parameters
Kextends keyof { … }
N = neverParameters
keyK & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
)One of the keys this record was defined with.
Returned when the record does not define
key.
Returns the value at
keyPath, walking nested records and collections.A literal key path is checked against the record's fields and gives the value's type; a computed one gives
unknown.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
Returns
unknownThe value at that path, or
undefinedwhen it does not resolve.Returns the value at
keyPath, walking nested records and collections.A literal key path is checked against the record's fields and gives the value's type; a computed one gives
unknown.
- has(
key: string,
): key is
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"Reports whether
keyis one of the keys this record was defined with.A literal key must name a field; a key typed as
stringis narrowed to the field names.Parameters
keystringThe key to look for.
Returns
key is
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"truewhen the record defines that key, even if its value isnull.
Computes a hash of this record from its contents, the same way Immutable.js does. Equal records have equal hashes; records with equal hashes are not necessarily equal. Plain objects, functions and symbols hash by identity, so a hash is only meaningful within the page that computed it.
Returns
numberAn integer hash.
Reports whether
keyPathresolves, walking nested records and collections.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
Returns
booleantruewhen every key along the path is present.
Reports whether
otheris a record of the same class holding equal values. Only the two records' own classes are compared; nested records compare asequals()does.Parameters
otherunknownThe value to compare against.
Returns
booleantruewhen both are the same class and every value matches.
Returns a record with the entries of each collection applied in order.
Keys the record was not defined with are ignored.
Returns a record with the entries of each collection merged in, recursing into nested collections and plain objects instead of replacing them.
Keys the record was not defined with are ignored.
Returns a record with each collection merged deeply into the value at
keyPath.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
...collectionsunknown[]Collections or plain objects to merge into the value there.
Returns
thisA new record, or this one when the value is unchanged.
mergeDeepWith(
merger: (previous: unknown, next: unknown, key: unknown) => unknown,
...collections: (Partial<{ … }> | Iterable<readonly [string, unknown]>)[],
): thisReturns a record with the entries of each collection merged in deeply, calling
mergerwhere a nested value is not a collection to decide the value that is kept.Keys the record was not defined with are ignored.
Parameters
Returns
thisA new record, or this one when no value changed.
Returns a record with each collection merged into the value at
keyPath, one level at a time.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
...collectionsunknown[]Collections or plain objects to merge into the value there.
Returns
thisA new record, or this one when the value is unchanged.
mergeWith(
merger: <K extends string | number | symbol>(
previous: { … }[K],
next: { … }[K],
key: K,
) => { … }[K],
...collections: (Partial<{ … }> | Iterable<readonly [string, unknown]>)[],
): thisReturns a record with the entries of each collection merged in, calling
mergerfor each key the record already holds to decide the value that is kept.Keys the record was not defined with are ignored.
Parameters
Returns
thisA new record, or this one when no value changed.
remove<K extends keyof { … }>(
key: K & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
),
): thisAn alias for delete.
Type Parameters
Kextends keyof { … }
Parameters
keyK & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
)One of the keys this record was defined with.
Returns
thisA new record, or this one when the value already equals the default.
set<K extends keyof { … }>(
key: K & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
),
value: { … }[K],
): thisReturns a record with
keyset tovalue.Setting a key to the value it already holds returns the same instance, so a record can be compared by reference to detect a change.
Type Parameters
Kextends keyof { … }
Parameters
Returns
thisA new record, or this one when the value is unchanged or the key is not defined.
Returns a record with
valuewritten atkeyPath.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
valueunknownThe value to store.
Returns
thisA new record, or this one when the value is unchanged.
Converts this record and everything nested inside it to plain JavaScript values.
Returns
{ … }
A plain object holding this record's values, converted all the way down.
id: string | null
A unique identifier for the comment. When comment is created in the UI, the viewer has to generate a unique ID.
rootId: string | null
The ID of the annotation that this comment stems from. In Nutrient Web SDK, this should be either a NutrientViewer.Annotations.MarkupAnnotation or a NutrientViewer.Annotations.CommentMarkerAnnotation.
pageIndex: number | null
The page index that this comment resides at.
pdfObjectId: number | null
If this comment is from the original PDF, then this ID is from that PDF note annotation that defined the comment.
creatorName: string | null
The name of the person who created the comment.
- ReadonlycreatedBy: string | null
The ID of the user who created the comment, as determined by the authenticated user (the
user_idclaim of the JWT) that created it.You cannot change who is recorded as the author: the value is assigned by the backend, and a locally set value is never sent. It is only available on Server-Backed deployments, and is
nullfor comments created without an authenticated user, as well as when the server holds an author it can no longer resolve to an upstream user id. createdAt: Date
The time when the comment was created.
updatedAt: Date
The time when the comment was last updated.
text: { format: "plain" | "xhtml"; value: string | null }
The text of the comment in xhtml/plain text format.
In case of XHTML, we support the following tags:
<b>: Bold<i>: Italic<span>: Font color, background color and underline using thestyleattribute (e.g.<span style="color: red; background-color: blue; text-decoration: underline">Hello</span>)p: Paragraph. You can use this to add a newline between paragraphs.a: Link. You can use this to add a link to the comment. Thehrefattribute is required.
customData: Record<string, unknown> | null
Arbitrary JSON-serializable data the user can attach to the comment.
- Optionalgroup?: string | null
This property is used to define the permission scope for a particular comment.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
- OptionalReadonlyisEditable?: boolean
This property defines whether this comment can be edited or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
- OptionalReadonlyisDeletable?: boolean
This property defines whether this comment can be deleted or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
- OptionalReadonlycanSetGroup?: boolean
This property defines whether the user has permission to edit the group of this comment. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
An alias for toObject, called by
JSON.stringify.Returns
{ … }
A plain object holding this record's values.
- OptionalReadonlycanSetGroup?: boolean
This property defines whether the user has permission to edit the group of this comment. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
createdAt: Date
The time when the comment was created.
- ReadonlycreatedBy: string | null
The ID of the user who created the comment, as determined by the authenticated user (the
user_idclaim of the JWT) that created it.You cannot change who is recorded as the author: the value is assigned by the backend, and a locally set value is never sent. It is only available on Server-Backed deployments, and is
nullfor comments created without an authenticated user, as well as when the server holds an author it can no longer resolve to an upstream user id. creatorName: string | null
The name of the person who created the comment.
customData: Record<string, unknown> | null
Arbitrary JSON-serializable data the user can attach to the comment.
- Optionalgroup?: string | null
This property is used to define the permission scope for a particular comment.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
id: string | null
A unique identifier for the comment. When comment is created in the UI, the viewer has to generate a unique ID.
- OptionalReadonlyisDeletable?: boolean
This property defines whether this comment can be deleted or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
- OptionalReadonlyisEditable?: boolean
This property defines whether this comment can be edited or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
pageIndex: number | null
The page index that this comment resides at.
pdfObjectId: number | null
If this comment is from the original PDF, then this ID is from that PDF note annotation that defined the comment.
rootId: string | null
The ID of the annotation that this comment stems from. In Nutrient Web SDK, this should be either a NutrientViewer.Annotations.MarkupAnnotation or a NutrientViewer.Annotations.CommentMarkerAnnotation.
text: { format: "plain" | "xhtml"; value: string | null }
The text of the comment in xhtml/plain text format.
In case of XHTML, we support the following tags:
<b>: Bold<i>: Italic<span>: Font color, background color and underline using thestyleattribute (e.g.<span style="color: red; background-color: blue; text-decoration: underline">Hello</span>)p: Paragraph. You can use this to add a newline between paragraphs.a: Link. You can use this to add a link to the comment. Thehrefattribute is required.
updatedAt: Date
The time when the comment was last updated.
Converts this record to a plain object, one level deep. Nested records are left as they are.
Returns
{ … }
A plain object holding this record's values.
- OptionalReadonlycanSetGroup?: boolean
This property defines whether the user has permission to edit the group of this comment. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
createdAt: Date
The time when the comment was created.
- ReadonlycreatedBy: string | null
The ID of the user who created the comment, as determined by the authenticated user (the
user_idclaim of the JWT) that created it.You cannot change who is recorded as the author: the value is assigned by the backend, and a locally set value is never sent. It is only available on Server-Backed deployments, and is
nullfor comments created without an authenticated user, as well as when the server holds an author it can no longer resolve to an upstream user id. creatorName: string | null
The name of the person who created the comment.
customData: Record<string, unknown> | null
Arbitrary JSON-serializable data the user can attach to the comment.
- Optionalgroup?: string | null
This property is used to define the permission scope for a particular comment.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
id: string | null
A unique identifier for the comment. When comment is created in the UI, the viewer has to generate a unique ID.
- OptionalReadonlyisDeletable?: boolean
This property defines whether this comment can be deleted or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
- OptionalReadonlyisEditable?: boolean
This property defines whether this comment can be edited or not. The value of this field depends on the set of collaboration permissions defined in the JWT token.
It is only available when collaboration permissions is enabled on Server-Backed deployments.
pageIndex: number | null
The page index that this comment resides at.
pdfObjectId: number | null
If this comment is from the original PDF, then this ID is from that PDF note annotation that defined the comment.
rootId: string | null
The ID of the annotation that this comment stems from. In Nutrient Web SDK, this should be either a NutrientViewer.Annotations.MarkupAnnotation or a NutrientViewer.Annotations.CommentMarkerAnnotation.
text: { format: "plain" | "xhtml"; value: string | null }
The text of the comment in xhtml/plain text format.
In case of XHTML, we support the following tags:
<b>: Bold<i>: Italic<span>: Font color, background color and underline using thestyleattribute (e.g.<span style="color: red; background-color: blue; text-decoration: underline">Hello</span>)p: Paragraph. You can use this to add a newline between paragraphs.a: Link. You can use this to add a link to the comment. Thehrefattribute is required.
updatedAt: Date
The time when the comment was last updated.
update<K extends keyof { … }>(
key: K & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
),
updater: (value: { … }[K]) => { … }[K],
): thisReturns a record with
keyreplaced by the result of applyingupdaterto its current value.Type Parameters
Kextends keyof { … }
Parameters
keyK & (
| "id"
| "rootId"
| "pageIndex"
| "pdfObjectId"
| "creatorName"
| "createdBy"
| "createdAt"
| "updatedAt"
| "text"
| "customData"
| "group"
| "isEditable"
| "isDeletable"
| "canSetGroup"
)One of the keys this record was defined with.
Returns
thisA new record, or this one when the value is unchanged.
- updateIn<N>(
keyPath: Iterable<unknown>,
notSetValue: N,
updater: (value: unknown) => unknown,
): thisReturns a record with the value at
keyPathreplaced by the result ofupdater. Returns a record with the value at
keyPathreplaced by the result ofupdater.Parameters
keyPathIterable<unknown>The keys to follow, outermost first.
updater(value: unknown) => unknownReceives the current value and returns the new one.
Returns
thisA new record, or this one when the value is unchanged.
Applies several changes as one, so only a single new record is allocated.
The record handed to
mutatormay be written to withset; it is frozen again oncemutatorreturns.Parameters
mutator(mutable: this) => unknownReceives a temporarily writable copy of this record.
Returns
thisA new record holding the applied changes, or this one when nothing changed.
A text comment made by the user. A comment belongs to a thread by pointing its
rootIdto theidof a root annotation. The root annotation can be a NutrientViewer.Annotations.CommentMarkerAnnotation or an existing markup annotation withisCommentThreadRootenabled.Use NutrientViewer.Instance#create, NutrientViewer.Instance#getComments, NutrientViewer.Instance#update, and NutrientViewer.Instance#delete to create, read, update, and delete comments.