@onlyoffice/docspace-plugin-sdk
Version:
Simple plugin system for onlyoffice docspace
538 lines (537 loc) • 14 kB
TypeScript
/**
* (c) Copyright Ascensio System SIA 2025
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @license
*/
import { Components } from "../../enums";
import { IBox } from "./IBox";
import { IButton } from "./IButton";
import { ICheckbox } from "./ICheckbox";
import { IComboBox } from "./IComboBox";
import { IFrame } from "./IFrame";
import { IImage } from "./IImage";
import { IInput } from "./IInput";
import { ILabel } from "./ILabel";
import { ISkeleton } from "./ISkeleton";
import { IText } from "./IText";
import { ITextArea } from "./ITextArea";
import { IToggleButton } from "./IToggleButton";
/**
* Defines the box component.
*
* @category Box
*
* @example
* ```typescript
* import { IBox, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const box: IBox = {
* widthProp: "200px",
* paddingProp: "16px",
* displayProp: "flex",
* flexDirection: "column",
* alignItems: "center",
* borderProp: {
* color: "#333333",
* radius: "8px",
* style: "solid",
* width: "1px"
* },
* backgroundProp: "#f8f9f9"
* };
*
* const boxGroup: Component = {
* component: Components.box,
* props: box,
* contextName: "container"
* };
* ```
*/
type BoxGroup = {
/** Defines the "box" component type */
component: Components.box;
/** Defines the box component properties */
props: IBox;
/** Defines the box component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the button component.
*
* @category Button
*
* @example
* ```typescript
* import { IButton, Components, Components, ButtonSize } from "@onlyoffice/docspace-plugin-sdk";
*
* const button: IButton = {
* size: ButtonSize.normal,
* label: "Click me!",
* onClick: () => {
* console.log("Button clicked!");
* },
* };
*
* const buttonGroup: Component = {
* component: Components.button,
* props: button,
* contextName: "button",
* };
* ```
*/
type ButtonGroup = {
/** Defines the "button" component type */
component: Components.button;
/** Defines the button component properties */
props: IButton;
/** Defines the button component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the checkbox component.
*
* @category Checkbox
*
* @example
* ```typescript
* import { ICheckbox, Components, Component, Actions } from "@onlyoffice/docspace-plugin-sdk";
*
* const checkbox: ICheckbox = {
* isChecked: false,
* label: "Enable notifications",
* onChange: () => {
* return {
* actions: [Actions.updateProps],
* newProps: {
* isChecked: !checkbox.isChecked
* }
* };
* },
* truncate: false,
* tabIndex: 1,
* hasError: false,
* name: "notifications",
* value: "enabled",
* isDisabled: false,
* title: "Notification preferences"
* };
*
* const checkboxGroup: Component = {
* component: Components.checkbox,
* props: checkbox,
* contextName: "notificationToggle"
* };
* ```
*/
type CheckboxGroup = {
/** Defines the "checkbox" component type */
component: Components.checkbox;
/** Defines the checkbox component properties */
props: ICheckbox;
/** Defines the checkbox component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the combo box component.
*
* @category ComboBox
*
* @example
* ```typescript
* import { IComboBox, IComboBoxItem, Components, Component, Actions } from "@onlyoffice/docspace-plugin-sdk";
*
* const comboBox: IComboBox = {
* options: [
* { key: "light", label: "Light Theme", icon: "theme-light.svg" },
* { key: "dark", label: "Dark Theme", icon: "theme-dark.svg" },
* { key: "system", label: "System Theme", icon: "theme-auto.svg" }
* ],
* selectedOption: { key: "light", label: "Light Theme", icon: "theme-light.svg" },
* onSelect: (item) => {},
* scaled: true,
* directionX: "right",
* directionY: "bottom",
* displayType: "default",
* modernView: true
* };
*
* const comboBoxGroup: Component = {
* component: Components.comboBox,
* props: comboBox,
* contextName: "themeSelector"
* };
* ```
*/
type ComboBoxGroup = {
/** Defines the "comboBox" component type */
component: Components.comboBox;
/** Defines the combo box component properties */
props: IComboBox;
/** Defines the combo box component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the iframe component.
*
* @category Frame
*
* @example
* ```typescript
* import { IFrame, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const iframe: IFrame = {
* src: "https://example.com/embedded-content",
* width: "100%",
* height: "500px",
* name: "content-frame",
* sandbox: "allow-scripts allow-same-origin",
* id: "content-iframe",
* style: {
* border: "1px solid #eceef1",
* borderRadius: "4px",
* backgroundColor: "#ffffff"
* }
* };
*
* const iframeGroup: Component = {
* component: Components.iFrame,
* props: iframe,
* contextName: "embeddedContent"
* };
* ```
*/
type IFrameGroup = {
/** Defines the "iFrame" component type */
component: Components.iFrame;
/** Defines the iFrame component properties */
props: IFrame;
/** Defines the iFrame component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the image component.
*
* @category Image
*
* @example
* ```typescript
* import { IImage, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const image: IImage = {
* src: "https://example.com/plugin-banner.png",
* alt: "Plugin Banner",
* width: "100%",
* height: "auto",
* name: "plugin-banner",
* id: "banner-image",
* style: {
* borderRadius: "8px",
* boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)",
* maxWidth: "600px"
* }
* };
*
* const imageGroup: Component = {
* component: Components.img,
* props: image,
* contextName: "bannerImage"
* };
* ```
*/
type ImageGroup = {
/** Defines the "img" component type */
component: Components.img;
/** Defines the image component properties */
props: IImage;
/** Defines the image component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the input component.
*
* @category Input
*
* @example
* ```typescript
* import { IInput, Components, Component, Actions, InputSize } from "@onlyoffice/docspace-plugin-sdk";
*
* const input: IInput = {
* value: "",
* onChange: (value) => {},
* placeholder: "Enter text...",
* size: InputSize.middle,
* name: "search-input",
* isAutoFocused: true,
* iconName: "search",
* iconSize: 16,
* scale: true,
* onIconClick: () => {
* console.log("Search icon clicked");
* }
* };
*
* const inputGroup: Component = {
* component: Components.input,
* props: input,
* contextName: "searchInput"
* };
* ```
*/
type InputGroup = {
/** Defines the "input" component type */
component: Components.input;
/** Defines the input component properties */
props: IInput;
/** Defines the input component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the label component.
*
* @category Label
*
* @example
* ```typescript
* import { ILabel, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const label: ILabel = {
* text: "Plugin Settings",
* isRequired: true,
* error: false,
* isInline: false,
* title: "Configure plugin settings",
* htmlFor: "settings-form",
* display: "block",
* truncate: true
* };
*
* const labelGroup: Component = {
* component: Components.label,
* props: label,
* contextName: "settingsLabel"
* };
* ```
*/
type LabelGroup = {
/** Defines the "label" component type */
component: Components.label;
/** Defines the label component properties */
props: ILabel;
/** Defines the label component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the skeleton component.
*
* @category Skeleton
*
* @example
* ```typescript
* import { ISkeleton, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const skeleton: ISkeleton = {
* width: "100%",
* height: "200px",
* borderRadius: "8px"
* };
*
* const skeletonGroup: Component = {
* component: Components.skeleton,
* props: skeleton,
* contextName: "loadingState"
* };
* ```
*/
type SkeletonGroup = {
/** Defines the "skeleton" component type */
component: Components.skeleton;
/** Defines the skeleton component properties */
props: ISkeleton;
/** Defines the skeleton component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the text component.
*
* @category Text
*
* @example
* ```typescript
* import { IText, Components, Component } from "@onlyoffice/docspace-plugin-sdk";
*
* const text: IText = {
* text: "Welcome to DocSpace Plugin",
* fontSize: "18px",
* fontWeight: 500,
* lineHeight: "24px",
* color: "#333333",
* isBold: false,
* textAlign: "left",
* truncate: true,
* title: "Welcome to DocSpace Plugin"
* };
*
* const textGroup: Component = {
* component: Components.text,
* props: text,
* contextName: "welcomeText"
* };
* ```
*/
type TextGroup = {
/** Defines the "text" component type */
component: Components.text;
/** Defines the text component properties */
props: IText;
/** Defines the text component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the textarea component.
*
* @category TextArea
*
* @example
* ```typescript
* import { ITextArea, Components, Component, Actions } from "@onlyoffice/docspace-plugin-sdk";
*
* const textarea: ITextArea = {
* value: "",
* onChange: (value) => {},
* placeholder: "Enter description...",
* heightTextArea: 150,
* fontSize: 14,
* isFullHeight: true,
* heightScale: true,
* maxLength: 1000,
* hasNumeration: false
* };
*
* const textAreaGroup: Component = {
* component: Components.textArea,
* props: textarea,
* contextName: "descriptionEditor"
* };
* ```
*/
type TextAreaGroup = {
/** Defines the "textArea" component type */
component: Components.textArea;
/** Defines the textarea component properties */
props: ITextArea;
/** Defines the textarea component context name that updates the component via React context */
contextName?: string;
};
/**
* Defines the toggle button component.
*
* @category ToggleButton
*
* @example
* ```typescript
* import { IToggleButton, Components, Component, Actions } from "@onlyoffice/docspace-plugin-sdk";
*
* const toggleButton: IToggleButton = {
* label: "Auto-sync",
* isChecked: true,
* onChange: () => {},
* style: {
* backgroundColor: "#f8f9f9",
* padding: "8px 12px",
* borderRadius: "4px"
* }
* };
*
* const toggleButtonGroup: Component = {
* component: Components.toggleButton,
* props: toggleButton,
* contextName: "syncToggle"
* };
* ```
*/
type ToggleButtonGroup = {
/** Defines the "toggleButton" component type */
component: Components.toggleButton;
/** Defines the toggle button component properties */
props: IToggleButton;
/** Defines the toggle button component context name that updates the component via React context */
contextName?: string;
};
/**
* A component that is used to add components into Box.
* Only components that are embedded into DOM can be wrapped (toast, modal dialog, etc. cannot be wrapped).
*
* @category Component
*
* @example
* ```typescript
* import {
* IBox,
* IText,
* IButton,
* ButtonSize,
* Components,
* Component,
* Actions
* IToast,
* ToastType,
* } from "@onlyoffice/docspace-plugin-sdk";
*
* const title: IText = {
* text: "Plugin Settings",
* fontSize: "18px",
* fontWeight: 600,
* };
*
* const button: IButton = {
* label: "Save Changes",
* onClick: () => {
* return {
* actions: [Actions.showToast],
* toastProps: [{
* title: "Success",
* type: ToastType.success,
* }]
* };
* },
* size: ButtonSize.normal,
* primary: true
* };
*
* // Create a settings panel with text and button
* const container: IBox = {
* paddingProp: "16px",
* backgroundProp: "#f8f9f9",
* children: [
* {
* component: Components.text,
* props: title
* },
* {
* component: Components.button,
* props: button
* }
* ]
* };
*
* // Combine components into a layout
* const settingsPanel: Component = {
* component: Components.box,
* props: container
* };
* ```
*/
type Component = BoxGroup | ButtonGroup | CheckboxGroup | ComboBoxGroup | IFrameGroup | ImageGroup | InputGroup | LabelGroup | SkeletonGroup | TextGroup | TextAreaGroup | ToggleButtonGroup;
export { Component, BoxGroup, ButtonGroup, CheckboxGroup, ComboBoxGroup, IFrameGroup, ImageGroup, InputGroup, LabelGroup, SkeletonGroup, TextGroup, TextAreaGroup, ToggleButtonGroup, };