Events

SpreadJS provides events for comments on the sheet to let you react to events that have happened.

The CommentChanged event occurs when the comment has changed (such as some properties have changed).
import * as React from 'react'; import { createRoot } from 'react-dom/client'; import './styles.css'; import { AppFunc } from './app-func'; // import { App } from './app-class'; // 1. Functional Component sample createRoot(document.getElementById('app')).render(<AppFunc />); // 2. Class Component sample // createRoot(document.getElementById('app')).render(<App />);
import * as React from 'react'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import GC from '@mescius/spread-sheets'; let spread = null; export function AppFunc() { const [commentEventMessage, setCommentEventMessage] = React.useState([]); const initSpread = (currSpread) => { let SpreadNs = GC.Spread.Sheets; spread = currSpread; spread.suspendPaint(); let sheet = spread.getActiveSheet(); sheet.comments.add(1, 1, "new comment!"); sheet.setText(1, 1, "Comment"); sheet.bind(SpreadNs.Events.CommentChanged, function (e, args) { let text = commentEventMessage; text.push("CommentChanged:" + " " + args.propertyName); setCommentEventMessage(text.slice()); }); // get comment and change some properties to fire event let comment = sheet.comments.get(1, 1); comment.text("Edit the comment, do resize, drag or other actions to fire the CommentChanged event."); comment.backColor("white"); comment.foreColor("#82BC00"); comment.displayMode(SpreadNs.Comments.DisplayMode.alwaysShown); spread.resumePaint(); } const changeCommentInfo = (event) => { var value = event.target.value; var newValue = value.split("\n"); setCommentEventMessage(newValue); // this speed is so slow } return (<div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={initSpread}> <Worksheet></Worksheet> </SpreadSheets> </div> <Panel panelinfo={commentEventMessage} changeCommentInfo={changeCommentInfo} /> </div>); } function Panel(props) { return ( <div class="options-container"> <textarea id="commentEvent" style={{ width: "100%", height: "90px" }} value={props.panelinfo.join("\n")} onChange={(e) => { props.changeCommentInfo(e) }}></textarea> </div> ); }
import * as React from 'react'; import { SpreadSheets, Worksheet} from '@mescius/spread-sheets-react'; import GC from '@mescius/spread-sheets'; const Component = React.Component; export class App extends Component { constructor(props) { super(props); this.spread = null; this.state = { commentEventMessage: [] }; this.autoGenerateColumns = false; } render() { return (<div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> <Worksheet></Worksheet> </SpreadSheets> </div> <Panel panelinfo={this.state.commentEventMessage} changeCommentInfo={(event)=>{this.changeCommentInfo(event)}} /> </div>); } initSpread(spread) { let self = this; let SpreadNs = GC.Spread.Sheets; self.spread = spread; spread.suspendPaint(); let sheet = spread.getActiveSheet(); sheet.comments.add(1, 1, "new comment!"); sheet.setText(1,1,"Comment"); sheet.bind(SpreadNs.Events.CommentChanged, function (e, args) { let text = self.state.commentEventMessage; text.push("CommentChanged:"+" "+args.propertyName); self.setState({ commentEventMessage: text }) }); // get comment and change some properties to fire event let comment = sheet.comments.get(1, 1); comment.text("Edit the comment, do resize, drag or other actions to fire the CommentChanged event."); comment.backColor("white"); comment.foreColor("#82BC00"); comment.displayMode(SpreadNs.Comments.DisplayMode.alwaysShown); spread.resumePaint(); } changeCommentInfo(event){ var value=event.target.value; var newValue=value.split("\n"); this.setState({commentEventMessage:newValue}); // this speed is so slow } } class Panel extends Component { constructor(props) { super(props); } render() { return ( <div class="options-container"> <textarea id="commentEvent" style={{ width: "100%", height: "90px" }} value={this.props.panelinfo.join("\n")} onChange={(e)=>{this.props.changeCommentInfo(e)}}></textarea> </div> ) } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/react/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/en/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/en/lib/react/license.js').then(function () { System.import('./src/app'); }); </script> </head> <body> <div id="app"></div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; overflow: auto; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; } textarea { width: 100%; height: 80px; padding: 6px 12px; box-sizing: border-box; } .sample-options { z-index: 1000; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-react': 'npm:@mescius/spread-sheets-react/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/cjs/react.production.js', 'react-dom': 'npm:react-dom/cjs/react-dom.production.js', 'react-dom/client': 'npm:react-dom/cjs/react-dom-client.production.js', 'scheduler': 'npm:scheduler/cjs/scheduler.production.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);