Weave.js

WeaveCommentNode

Comment node API Reference

Overview

The WeaveCommentNode class represents a way to provide feedback to users and let them know where comments have been created on the Weave.js canvas.

It also provides a headless mechanism to render DOM nodes to create or view / manage the comment model.

The class extends the WeaveNode class

Not shareable thought the room state

This node is intended and designed to be used standalone, it doesn't support to be shared via the room state mechanism.

Type

This node nodeType property value is arrow.

Import

import { WeaveCommentNode } from "@inditextech/weave-sdk";

Instantiation

new WeaveCommentNode<T>(params: WeaveCommentNodeParams<T>);

TypeScript types

type WeaveCommentNodeCreateActionKeys =
  keyof typeof WEAVE_COMMENT_CREATE_ACTION;
type WeaveCommentNodeCreateAction =
  (typeof WEAVE_COMMENT_CREATE_ACTION)[WeaveCommentNodeCreateActionKeys];

type WeaveCommentNodeViewActionKeys = keyof typeof WEAVE_COMMENT_VIEW_ACTION;
type WeaveCommentNodeViewAction =
  (typeof WEAVE_COMMENT_VIEW_ACTION)[WeaveCommentNodeViewActionKeys];

type WeaveCommentNodeActionKeys = keyof typeof WEAVE_COMMENT_NODE_ACTION;
type WeaveCommentNodeAction =
  (typeof WEAVE_COMMENT_NODE_ACTION)[WeaveCommentNodeActionKeys];

type WeaveCommentStatusKeys = keyof typeof WEAVE_COMMENT_STATUS;
type WeaveCommentStatus = (typeof WEAVE_COMMENT_STATUS)[WeaveCommentStatusKeys];

type WeaveCommentNodeStyle = {
  stroke: string;
  strokeWidth: number;
  shadowColor: string;
  shadowBlur: number;
  shadowOffsetX: number;
  shadowOffsetY: number;
  shadowOpacity: number;
  contracted: {
    width: number;
    height: number;
    circlePadding: number;
    userName: {
      fontFamily: string;
      fontSize: number;
      fontStyle: string;
    };
  };
  expanded: {
    width: number;
    userNameLeftMargin: number;
    dateLeftMargin: number;
    contentTopMargin: number;
    contentBottomMargin: number;
    userName: {
      fontFamily: string;
      fontSize: number;
      fontStyle: string;
      color: string;
    };
    date: {
      fontFamily: string;
      fontSize: number;
      fontStyle: string;
      color: string;
    };
    content: {
      maxLines: number;
      fontFamily: string;
      fontSize: number;
      fontStyle: string;
      color: string;
    };
  };
  creating: {
    paddingX: number;
    paddingY: number;
    stroke: string;
    strokeWidth: number;
  };
  viewing: {
    paddingX: number;
    paddingY: number;
    stroke: string;
    strokeWidth: number;
  };
};

type WeaveCommentNodeModel<T> = {
  getDate: (comment: T) => string;
  getId: (comment: T) => string;
  getUserId: (comment: T) => string;
  getStatus: (comment: T) => WeaveCommentStatus;
  getUserShortName: (comment: T) => string;
  getUserFullName: (comment: T) => string;
  canUserDrag: (comment: T) => boolean;
  getContent: (comment: T) => string;
  setMarkResolved: (comment: T) => T;
  setContent: (comment: T, content: string) => T;
};

type WeaveCommentNodeConfig<T> = {
  style: WeaveCommentNodeStyle;
  model: WeaveCommentNodeModel<T>;
  formatDate: (date: string) => string;
  createComment: (
    ele: HTMLDivElement,
    node: WeaveElementInstance,
    finish: (
      node: WeaveElementInstance,
      content: string,
      action: WeaveCommentNodeCreateAction
    ) => void
  ) => Promise<void>;
  viewComment: (
    ele: HTMLDivElement,
    node: WeaveElementInstance,
    finish: (
      node: WeaveElementInstance,
      content: string,
      action: WeaveCommentNodeViewAction
    ) => void
  ) => Promise<void>;
};

type WeaveCommentNodeParams<T> = {
  config: Pick<
    WeaveCommentNodeConfig<T>,
    "model" | "formatDate" | "createComment" | "viewComment"
  > &
    DeepPartial<Pick<WeaveCommentNodeConfig<T>, "style">>;
};

type WeaveCommentNodeOnFinishCreateEvent = {
  node: WeaveElementInstance;
  action: WeaveCommentNodeCreateAction;
};

type WeaveCommentNodeOnCreateCommentEvent = {
  node: WeaveElementInstance;
  position: Konva.Vector2d;
  content: string;
};

type WeaveCommentNodeOnViewEvent = {
  node: WeaveElementInstance;
};

type WeaveCommentNodeOnDragStartEvent = {
  node: WeaveElementInstance;
};

type WeaveCommentNodeOnDragEndEvent = {
  node: WeaveElementInstance;
};

Parameters

For WeaveCommentNodeParams<T>:

PropTypeDefault
config
Pick<WeaveCommentNodeConfig<T>, 'model' | 'formatDate' | 'createComment' | 'viewComment'> & DeepPartial<Pick<WeaveCommentNodeConfig<T>, 'style'>>
-

For Pick<WeaveCommentNodeConfig<T>, 'model' | 'formatDate' | 'createComment' | 'viewComment'> & DeepPartial<Pick<WeaveCommentNodeConfig<T>, 'style'>>:

PropTypeDefault
viewComment
(ele: HTMLDivElement, node: WeaveElementInstance, finish: (node: WeaveElementInstance, content: string, action: WeaveCommentNodeViewAction) => void) => Promise<void>
-
createComment
(ele: HTMLDivElement, node: WeaveElementInstance, finish: (node: WeaveElementInstance, content: string, action: WeaveCommentNodeCreateAction) => void) => Promise<void>
-
formatDate
(date: string) => string
-
model
WeaveCommentNodeModel<T>
-
style?
WeaveCommentNodeStyle
check default values

Default values

const WEAVE_COMMENT_STATUS = {
  PENDING: "pending",
  RESOLVED: "resolved",
} as const;

const WEAVE_COMMENT_CREATE_ACTION = {
  CREATE: "create",
  CLOSE: "close",
} as const;

const WEAVE_COMMENT_VIEW_ACTION = {
  REPLY: "reply",
  MARK_RESOLVED: "markResolved",
  EDIT: "edit",
  DELETE: "delete",
  CLOSE: "close",
} as const;

const WEAVE_COMMENT_NODE_ACTION = {
  IDLE: "idle",
  CREATING: "creating",
  VIEWING: "viewing",
} as const;

const WEAVE_COMMENT_NODE_TYPE = "comment";

const WEAVE_COMMENT_NODE_DEFAULTS = {
  style: {
    stroke: "#000000",
    strokeWidth: 0,
    shadowColor: "rgba(0,0,0,0.25)",
    shadowBlur: 4,
    shadowOffsetX: 0,
    shadowOffsetY: 0,
    shadowOpacity: 0.8,
    contracted: {
      width: 40,
      height: 40,
      circlePadding: 2,
      userName: {
        fontFamily: "arial, sans-serif",
        fontSize: 14,
        fontStyle: "normal",
      },
    },
    expanded: {
      width: 250,
      userNameLeftMargin: 8,
      dateLeftMargin: 8,
      contentTopMargin: 8,
      contentBottomMargin: 12,
      userName: {
        fontFamily: "arial, sans-serif",
        fontSize: 12,
        fontStyle: "bold",
        color: "#000000",
      },
      date: {
        fontFamily: "arial, sans-serif",
        fontSize: 12,
        fontStyle: "normal",
        color: "#757575",
      },
      content: {
        fontFamily: "arial, sans-serif",
        fontSize: 12,
        maxLines: 3,
        fontStyle: "normal",
        color: "#000000",
      },
    },
    creating: {
      paddingX: 8,
      paddingY: -4,
      stroke: "#1a1aff",
      strokeWidth: 2,
    },
    viewing: {
      paddingX: 8,
      paddingY: -18,
      stroke: "#1a1aff",
      strokeWidth: 2,
    },
  },
  formatDate: (date: string) => date,
};

Methods

setCommentModel

setCommentModel(commentNode: WeaveElementInstance, comment: T): void

This method associates to a node instance it respective model instance, useful after creating, to associate the newly created module to the created instance.

focusOn

focusOn(nodeId: string, duration = 0.5): void

This method focus the stage on the node with a nice animation. The animation duration can be tuned.

setCommentViewing

setCommentViewing(commentId: string | null): void

This method sets if a comment is actually on the viewing internal state for the DOM, passing the comment Id from the model that is visible. If null is passed the internal state is idle.

setCommentViewing

isCommentViewing(): boolean

This method returns true if the internal state of the DOM is `viewing'.

isCommentCreating

isCommentCreating(): boolean

This method returns true if the internal state of the DOM is `creating'.

getCommentId

getCommentId(node: WeaveElementInstance): string

Gets the comment Id from the node using the defined model functions.

setShowResolved

setShowResolved(show: boolean): void

If true, allow to render nodes that are on the resolved status.

Events

onCommentFinishCreate

onCommentFinishCreate: WeaveCommentNodeOnFinishCreateEvent;

The onCommentFinishCreate event is called when the create loop is finished.

onCommentCreate

onCommentCreate: WeaveCommentNodeOnCreateCommentEvent;

The onCommentCreate event is called when a comment is created. Useful to initiate sync state with other peers.

onCommentView

onCommentView: WeaveCommentNodeOnViewEvent;

The onCommentView event is called when a comment overlay DOM is rendered on the UI. Used internally on the Comment tool to handle it internal state machine.

onCommentDragEnd

onCommentDragEnd: WeaveCommentNodeOnDragEndEvent;

The onCommentDragEnd event is called when a comment finished a drag to change it's position. Useful to update the model with the new (x,y) coordinates for the new position.