Spreadsheet Toolbar
This section provides comprehensive information about methods, settings, and events related to the data grid toolbar, including customization options and essential configurations.
Icons
The use of Material icons style sheet is required for using the toolbar.
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" />
Documentation
Methods
Methods to show, hide, or customize the toolbar.
| Method | Description |
|---|---|
getToolbar | Get the toolbar's current settings.getToolbar() : Object |
setToolbar | Redefine the toolbar settings.setToolbar(settings: Object) : voidParameters: Toolbar object with options described below. |
showToolbar | Show the toolbar using the current settings.showToolbar() : void |
hideToolbar | Hide the toolbar.hideToolbar() : void |
refreshToolbar | Refresh the toolbar.refreshToolbar(worksheet: Object) : void |
Settings
Customize toolbar items during initialization using the following property:
| Property | Description |
|---|---|
| toolbar?: boolean | 'extended' | function | object | Enable toolbar with different configuration options. |
Toolbar Object
The toolbar object allows you to define custom toolbar configurations with the following properties.
Toolbar general properties
| Property | Description |
|---|---|
container: boolean | Show the toolbar container border. |
badge: boolean | Add a badge container for each toolbar element. |
title: boolean | Show title text below the icons. |
responsive: boolean | Responsive toolbar. Default: false |
items: Items[] | Items for the toolbar. |
Toolbar item properties
| Property | Description |
|---|---|
type: string | Element type: icon | divisor | label | select |
content: string | Content of the toolbar element (text or Material icon name) |
tooltip: string | Tooltip text for the toolbar element |
width: number | Toolbar element width |
active: boolean | Initial state for the toolbar element |
class: string | CSS Class for each toolbar element |
value: number | The initially selected option for the type: select |
render: method | Render method parser for the elements in the dropdown when type: select |
onclick: method | When an item is clicked |
onchange: method | When a new item is selected. Valid for the type: select. |
updateState: Function | Create the item state controller.updateState: function(root: HTMLElement, instance: Object, item: HTMLElement, worksheet: Object) => void |
Examples
Toolbar visibility
The example below demonstrates how to enable the default toolbar and programmatically show or hide it after initialization.
<html> <script src="https://jspreadsheet.com/v12/jspreadsheet.js"></script> <script src="https://jsuites.net/v6/jsuites.js"></script> <link rel="stylesheet" href="https://jspreadsheet.com/v12/jspreadsheet.css" type="text/css" /> <link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" /> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" /> <div id="spreadsheet"></div> <p><input type='button' value='Show Toolbar' id="btn1"> <input type='button' value='Hide Toolbar' id="btn2"></p> <script> // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); // Create the spreadsheet let grid = jspreadsheet(document.getElementById('spreadsheet'), { worksheets: [ { minDimensions: [6,6] }, ], toolbar: true, }); document.getElementById("btn1").onclick = () => grid[0].parent.showToolbar(); document.getElementById("btn2").onclick = () => grid[0].parent.hideToolbar(); </script> </html> import React, {useRef} from "react"; import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default function App() { // Spreadsheet array of worksheets const spreadsheet = useRef(); // Render component return ( <> <Spreadsheet ref={spreadsheet} toolbar={true}> <Worksheet minDimensions={[6, 6]}/> </Spreadsheet> <input type='button' value='Show Toolbar' onClick={() => spreadsheet.current[0].parent.showToolbar()}/> <input type='button' value='Hide Toolbar' onClick={() => spreadsheet.current[0].parent.hideToolbar()}/> </> ); } <template> <Spreadsheet ref="spreadsheet" :toolbar="true"> <Worksheet :minDimensions="[6,6]" /> </Spreadsheet> <input type="button" value="Show Toolbar" @click="showToolbar" /> <input type="button" value="Hide Toolbar" @click="hideToolbar" /> </template> <script> import { Spreadsheet, Worksheet } from "@jspreadsheet/vue"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default { components: { Spreadsheet, Worksheet, }, methods: { showToolbar() { this.$refs.spreadsheet.current[0].parent.showToolbar(); }, hideToolbar() { this.$refs.spreadsheet.current[0].parent.hideToolbar(); }, }, data() { return { license, }; } } </script> import { Component, ViewChild, ElementRef } from "@angular/core"; import jspreadsheet from "jspreadsheet"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); @Component({ standalone: true, selector: "app-root", template: ` <div #spreadsheet></div> <input type="button" value="Show Toolbar" (click)="this.worksheets[0].parent.showToolbar();" /> <input type="button" value="Hide Toolbar" (click)="this.worksheets[0].parent.hideToolbar();" />` }) export class AppComponent { @ViewChild("spreadsheet") spreadsheet: ElementRef; // Worksheets worksheets: jspreadsheet.worksheetInstance[]; // Create a new data grid ngAfterViewInit() { // Create spreadsheet this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, { worksheets: [ { minDimensions: [6,6] }, ], toolbar: true }); } } Custom toolbar method handler
The toolbar property can be set as a function, which allows for the addition of a new custom item to the default toolbar without the need to create a new toolbar from scratch. See the example below.
<html> <script src="https://jspreadsheet.com/v12/jspreadsheet.js"></script> <link rel="stylesheet" href="https://jspreadsheet.com/v12/jspreadsheet.css" type="text/css" /> <script src="https://jsuites.net/v6/jsuites.js"></script> <link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" /> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" /> <div id="spreadsheet"></div> <script> // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); // Create the spreadsheet jspreadsheet(document.getElementById('spreadsheet'), { toolbar: function(toolbar) { // Add a new custom item in the end of my toolbar toolbar.items.push({ tooltip: 'My custom item', content: 'share', onclick: function() { alert('Custom click'); } }); return toolbar; }, worksheets: [{ minDimensions: [6,6], }] }); </script> </html> import React, { useRef } from "react"; import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default function App() { // Spreadsheet array of worksheets const spreadsheet = useRef(); // Toolbar handler const toolbar = (toolbar) => { // Add a new custom item in the end of my toolbar toolbar.items.push({ tooltip: 'My custom item', content: 'share', onclick: function() { alert('Custom click'); } }); return toolbar; } // Render component return ( <Spreadsheet ref={spreadsheet} toolbar={toolbar}> <Worksheet minDimensions={[6,6]} /> </Spreadsheet> ); } <template> <Spreadsheet ref="spreadsheet" :toolbar="true"> <Worksheet :minDimensions="[6,6]" /> </Spreadsheet> </template> <script> import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/vue"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default { components: { Spreadsheet, Worksheet, }, methods: { // Toolbar handler toolbar(toolbar) { // Add a new custom item in the end of my toolbar toolbar.items.push({ tooltip: 'My custom item', content: 'share', onclick: function() { alert('Custom click'); } }); return toolbar; } }, data() { return { license, }; } } </script> import { Component, ViewChild, ElementRef } from "@angular/core"; import jspreadsheet from "jspreadsheet"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); @Component({ selector: "app-root", template: `<div #spreadsheet></div>` }) export class AppComponent { @ViewChild("spreadsheet") spreadsheet: ElementRef; // Worksheets worksheets: jspreadsheet.worksheetInstance[]; // Create a new data grid ngAfterViewInit() { // Create spreadsheet this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, { toolbar: function(toolbar) { // Add a new custom item in the end of my toolbar toolbar.items.push({ tooltip: 'My custom item', content: 'share', onclick: function() { alert('Custom click'); } }); return toolbar; }, worksheets: [{ minDimensions: [6,6], }] }); } } Custom toolbar object
The toolbar property can be utilized to customize the items present in the spreadsheet toolbar.
<html> <script src="https://jspreadsheet.com/v12/jspreadsheet.js"></script> <link rel="stylesheet" href="https://jspreadsheet.com/v12/jspreadsheet.css" type="text/css" /> <script src="https://jsuites.net/v6/jsuites.js"></script> <link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" /> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" /> <div id="spreadsheet"></div> <script> let customToolbar = { items: [ { content: 'save', onclick: function () { jspreadsheet.current.download(); } }, { type:'divisor', }, { type:'select', width: '160px', options: [ 'Verdana', 'Arial', 'Courier New' ], render: function(e) { return '<span style="font-family:' + e + '">' + e + '</span>'; }, onchange: function(a,b,c,d) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-family', d); } }, { type: 'i', content: 'format_bold', onclick: function(a,b,c) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-weight', 'bold'); } }, { type: 'i', content: 'format_italic', onclick: function(a,b,c) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-style', 'italic'); } }, { content: 'search', onclick: function(a,b,c) { if (c.children[0].innerText == 'search') { jspreadsheet.current.showSearch(); c.children[0].innerText = 'search_off'; } else { jspreadsheet.current.hideSearch(); c.children[0].innerText = 'search'; } }, tooltip: 'Toggle Search', updateState: function(a,b,c,worksheet) { // Call this one when the worksheet is opened and on the selection of any cells if (worksheet.options.search == true) { c.children[0].innerText = 'search_off'; } else { c.children[0].innerText = 'search'; } } } ] } // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); // Create the spreadsheet jspreadsheet(document.getElementById('spreadsheet'), { worksheets: [{ worksheetName: 'Toolbar example', minDimensions: [6,6], }], toolbar: customToolbar }); </script> </html> import React, { useRef } from "react"; import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default function App() { // Spreadsheet array of worksheets const spreadsheet = useRef(); // Toolbar handler const toolbar = { items: [{ content: 'save', onclick: function () { spreadsheet.current.download(); } }, { type:'divisor', }, { type:'select', width: '160px', options: [ 'Verdana', 'Arial', 'Courier New' ], render: function(e) { return '<span style="font-family:' + e + '">' + e + '</span>'; }, onchange: function(a,b,c,d) { spreadsheet.current.setStyle(spreadsheet.current.getSelected(), 'font-family', d); } }, { type: 'i', content: 'format_bold', onclick: function(a,b,c) { spreadsheet.current.setStyle(spreadsheet.current.getSelected(), 'font-weight', 'bold'); } }, { type: 'i', content: 'format_italic', onclick: function(a,b,c) { spreadsheet.current.setStyle(spreadsheet.current.getSelected(), 'font-style', 'italic'); } }, { content: 'search', onclick: function(a,b,c) { if (c.children[0].innerText == 'search') { spreadsheet.current.showSearch(); c.children[0].innerText = 'search_off'; } else { spreadsheet.current.hideSearch(); c.children[0].innerText = 'search'; } }, tooltip: 'Toggle Search', updateState: function(a,b,c,worksheet) { // Call this one when the worksheet is opened and on the selection of any cells if (worksheet.options.search == true) { c.children[0].innerText = 'search_off'; } else { c.children[0].innerText = 'search'; } } } ] } // Render component return ( <Spreadsheet ref={spreadsheet} toolbar={toolbar}> <Worksheet minDimensions={[6,6]} worksheetName="Toolbar example" /> </Spreadsheet> ); } <template> <Spreadsheet ref="spreadsheet" :toolbar="toolbar"> <Worksheet :minDimensions="[6,6]" worksheetName="Toolbar example" /> </Spreadsheet> </template> <script> import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/vue"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZWM0YmQ1MWU3NzY5NzY0YzFjMWZiNjcwNTE2NTJlNDk1OWVlNThhNmIzZTgzNjYxOGJkY2RhNGVlOGI1NTNlMWM4ZDcyYzZkYjg1YWUxOGYyYWZiYWQ5MWFiYTFlNWI0YmRhM2VlNmE2NDU1MzZhNTQxODViNmU3NjViNzY5NzEsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpjME1UY3hOemczTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2liRzlqWVd4b2IzTjBJbDBzSW5Cc1lXNGlPaUl6TkNJc0luTmpiM0JsSWpwYkluWTNJaXdpZGpnaUxDSjJPU0lzSW5ZeE1DSXNJbll4TVNJc0luWXhNaUlzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElpd2ljR2wyYjNRaVhTd2laR1Z0YnlJNmRISjFaWDA9'); export default { components: { Spreadsheet, Worksheet, }, data() { // Toolbar handler const toolbar = { items: [{ content: 'save', onclick: function () { jspreadsheet.current.download(); } }, { type:'divisor', }, { type:'select', width: '160px', options: [ 'Verdana', 'Arial', 'Courier New' ], render: function(e) { return '<span style="font-family:' + e + '">' + e + '</span>'; }, onchange: function(a,b,c,d) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-family', d); } }, { type: 'i', content: 'format_bold', onclick: function(a,b,c) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-weight', 'bold'); } }, { type: 'i', content: 'format_italic', onclick: function(a,b,c) { jspreadsheet.current.setStyle(jspreadsheet.current.getSelected(), 'font-style', 'italic'); } }, { content: 'search', onclick: function(a,b,c) { if (c.children[0].innerText == 'search') { jspreadsheet.current.showSearch(); c.children[0].innerText = 'search_off'; } else { jspreadsheet.current.hideSearch(); c.children[0].innerText = 'search'; } }, tooltip: 'Toggle Search', updateState: function(a,b,c,worksheet) { // Call this one when the worksheet is opened and on the selection of any cells if (worksheet.options.search == true) { c.children[0].innerText = 'search_off'; } else { c.children[0].innerText = 'search'; } } } ] } return { toolbar, license, }; } } </script> import { Component, ViewChild, ElementRef } from "@angular/core"; import jspreadsheet from "jspreadsheet"; import "jsuites/dist/jsuites.css"; import "jspreadsheet/dist/jspreadsheet.css"; // You can use the following license for quick testing on localhost, StackBlitz, or CodeSandbox. // The license is valid for one day, after which the spreadsheet will become read-only. // For a longer trial period, you can create a free account and generate a demo license with an extended expiration date. jspreadsheet.setLicense('ZGIzOTQ1MGZjYTU2OWU1ZTMzMDdkMTFkZmY0Mzg0YTVkZGU2MDEzNjk0YjhiZWI3YzYzZWE0ZDlmN2Q3MzdiYTZhZmNlYTkxZmExN2NmMGZkYzdjZjc2NTkyOWRlMGJjNDdjZDZjM2NmMDMyNWEzMTQzNjQ1ZjQ0ZTJkZTY1YmQsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpFMk5UVXhNelF4TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ=='); @Component({ standalone: true, selector: "app-root", template: `<div #spreadsheet></div>` }) export class AppComponent { @ViewChild("spreadsheet") spreadsheet: ElementRef; // Worksheets worksheets: jspreadsheet.worksheetInstance[]; // Create a new data grid ngAfterViewInit() { // Custom toolbar definitions let customToolbar = { bottom: false, items: [ { content: 'save', onclick: function () { jspreadsheet.current!.download(); } }, { type: 'divisor', }, { type: 'select', width: '160px', options: ['Verdana', 'Arial', 'Courier New'], render: function (e:any) { return '<span style="font-family:' + e + '">' + e + '</span>'; }, onchange: function (a:any, b:any, c:any, d:any) { jspreadsheet.current!.setStyle(jspreadsheet.current!.getSelected(), 'font-family', d); } }, { type: 'i', content: 'format_bold', onclick: function (a:any, b:any, c:any) { jspreadsheet.current!.setStyle(jspreadsheet.current!.getSelected(), 'font-weight', 'bold'); } }, { type: 'i', content: 'format_italic', onclick: function (a:any, b:any, c:any) { jspreadsheet.current!.setStyle(jspreadsheet.current!.getSelected(), 'font-style', 'italic'); } }, { content: 'search', onclick: function (a:any, b:any, c:any) { if (c.children[0].innerText == 'search') { jspreadsheet.current!.showSearch(); c.children[0].innerText = 'search_off'; } else { jspreadsheet.current!.hideSearch(); c.children[0].innerText = 'search'; } }, tooltip: 'Toggle Search', updateState: function (a:any, b:any, c:any, worksheet:any) { // Call this one when the worksheet is opened and on the selection of any cells if (worksheet.options.search == true) { c.children[0].innerText = 'search_off'; } else { c.children[0].innerText = 'search'; } } } ] } // Create spreadsheet this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, { worksheets: [{ worksheetName: 'Toolbar example', minDimensions: [6, 6], }], toolbar: customToolbar as any, }); } } Default Toolbar Code
const getDefault = function() { let items = []; let spreadsheet = this; const getActive = function() { let i = spreadsheet.getWorksheetActive() || 0; return spreadsheet.worksheets[i]; } const getComputedStyle = function(prop) { let w = getActive(); if (w && w.cursor) { let t = window.getComputedStyle(w.cursor); return t.getPropertyValue(prop); } } const getSelected = function() { let w = getActive(); if (w) { return w.getSelected(); } return []; } items.push({ content: 'undo', onclick: function() { jspreadsheet.history.undo(); }, updateState: function(a,b,c,d) { let index = jspreadsheet.history.index + 1; if (index > 0) { c.classList.remove('jtoolbar-disabled'); } else { c.classList.add('jtoolbar-disabled'); } } }); items.push({ content: 'redo', onclick: function() { jspreadsheet.history.redo(); }, updateState: function(a,b,c,d) { let size = jspreadsheet.history.actions.length; let index = jspreadsheet.history.index + 1; if (size > index) { c.classList.remove('jtoolbar-disabled'); } else { c.classList.add('jtoolbar-disabled'); } } }); items.push({ content: 'save', onclick: function () { let w = getActive(); if (w) { w.download(); } } }); items.push({ type:'divisor', }); items.push({ type:'select', width: '120px', options: [ 'Default', 'Verdana', 'Arial', 'Courier New' ], render: function(e) { return '<span style="font-family:' + e + '">' + e + '</span>'; }, onchange: function(a,b,c,d,e) { let w = getActive(); if (w) { let cells = getSelected(); if (cells) { let value = (!e) ? '' : d; w.setStyle(cells, 'font-family', value); } } }, updateState: function(a,b,c,d) { let cell = d.selectedCell; if (cell && cell.length) { let value = getComputedStyle('font-family') || 0; if (value) { value = this.picker.options.data.findIndex(function (element) { return element.toLowerCase() === value.toLowerCase(); }); if (value === -1) { value = 0; } } c.picker.setValue(value); } } }); items.push({ type: 'select', width: '48px', content: 'format_size', options: ['x-small','small','medium','large','x-large'], render: function(e) { return '<span style="font-size:' + e + '">' + e + '</span>'; }, onchange: function(a,b,c,d) { let w = getActive(); if (w) { let cells = getSelected(); if (cells) { w.setStyle(cells, 'font-size', d); } } } }); items.push({ type: 'select', options: ['left','center','right','justify'], render: function(e) { return '<i class="material-icons">format_align_' + e + '</i>'; }, onchange: function(a,b,c,d) { let w = getActive(); if (w) { let cells = getSelected(); if (cells) { w.setStyle(cells, 'text-align', d); } } }, updateState: function(a,b,c,d) { let w = getActive(); let value = getComputedStyle('text-align'); if (! value) { if (w) { value = w.options.defaultColAlign; } if (! value) { value = 'center'; } } value = c.picker.options.data.indexOf(value); if (value === -1) { value = 1; } c.picker.setValue(value); } }); items.push({ content: 'format_bold', onclick: function(a,b,c) { let w = getActive(); if (w) { let current = getComputedStyle('font-weight'); let style = current === 'bold' || current > 400 ? '' : 'bold'; let cells = getSelected(); if (cells) { w.setStyle(cells, 'font-weight', style); } if (style === 'bold') { c.classList.add('jss_toolbar_selected'); } else { c.classList.remove('jss_toolbar_selected'); } } }, updateState: function(a,b,c,d) { // Readonly items component.item.call(d, c); // Current cell let value = getComputedStyle('font-weight'); if (value === 'bold' || value > 400) { c.classList.add('jss_toolbar_selected'); } else { c.classList.remove('jss_toolbar_selected'); } } }); items.push({ type: 'color', content: 'format_color_text', k: 'color', }); items.push({ type: 'color', content: 'format_color_fill', k: 'background-color', }); let verticalAlign = [ 'top','middle','bottom' ]; items.push({ type: 'select', options: [ 'vertical_align_top','vertical_align_center','vertical_align_bottom' ], render: function(e) { return '<i class="material-icons">' + e + '</i>'; }, value: 1, onchange: function(a,b,c,d,e) { let w = getActive(); if (w) { let cells = getSelected(); if (cells) { w.setStyle(cells, 'vertical-align', verticalAlign[e]); } } }, updateState: function(a,b,c,d) { let value = getComputedStyle('vertical-align') || 'middle'; if (value) { let index = verticalAlign.indexOf(value); c.picker.setValue(index); } } }); items.push({ content: 'web', onclick: function() { let w = getActive(); if (w) { if (confirm(T('The merged cells will retain the value of the top-left cell only. Are you sure?'))) { let h = w.getSelection(); if (h && h.length) { let cell = jspreadsheet.helpers.getColumnNameFromCoords(h[0], h[1]); if (w.records[h[1]][h[0]].merged) { w.removeMerge(cell); } else { w.setMerge(); } } } } }, tooltip: T('Merge the selected cells'), }); items.push({ type: 'select', data: [ 'border_all', 'border_outer', 'border_inner', 'border_horizontal', 'border_vertical', 'border_left', 'border_top', 'border_right', 'border_bottom', 'border_clear' ], columns: 5, render: function(e) { return '<i class="material-icons">' + e + '</i>'; }, right: true, onchange: function(a,b,c,d) { let w = getActive(); let h = w.getHighlighted(); if (h && h.length) { // Border type let type = d; // Default options let thickness = b.thickness || 1; // Border color let color = b.color || 'black'; // Border style const borderStyle = b.style || 'solid'; if (borderStyle === 'double') { thickness += 2; } // Updates to the cells let style = {}; // Create style strings const setBorder = function(columnName, i, j, selected) { // Coordinates for each selection let px = selected[0]; let py = selected[1]; let ux = selected[2]; let uy = selected[3]; let border = [ '','','','' ]; if (((type === 'border_top' || type === 'border_outer') && j === py) || ((type === 'border_inner' || type === 'border_horizontal') && j > py) || (type === 'border_all')) { border[0] = 'border-top: ' + thickness + 'px ' + borderStyle + ' ' + color; } else { border[0] = 'border-top: '; } if ((type === 'border_all' || type === 'border_right' || type === 'border_outer') && i === ux) { border[1] = 'border-right: ' + thickness + 'px ' + borderStyle + ' ' + color; } else { border[1] = 'border-right: '; } if ((type === 'border_all' || type === 'border_bottom' || type === 'border_outer') && j === uy) { border[2] = 'border-bottom: ' + thickness + 'px ' + borderStyle + ' ' + color; } else { border[2] = 'border-bottom: '; } if (((type === 'border_left' || type === 'border_outer') && i === px) || ((type === 'border_inner' || type === 'border_vertical') && i > px) || (type === 'border_all')) { border[3] = 'border-left: ' + thickness + 'px ' + borderStyle + ' ' + color; } else { border[3] = 'border-left: '; } style[columnName] = border.join(';'); } // Go over all selections h.forEach(function(selected) { for (let j = selected[1]; j <= selected[3]; j++) { // Row - py - uy for (let i = selected[0]; i <= selected[2]; i++) { // Col - px - ux let cellName = jspreadsheet.helpers.getColumnNameFromCoords(i, j); setBorder(cellName, i, j, selected); let record = w.records[j]; if (record && record[i]) { let merged = record[i].merged; if (merged) { cellName = jspreadsheet.helpers.getColumnNameFromCoords(merged[0].x, merged[0].y); setBorder(cellName, i, j, selected); } } } } }); if (Object.keys(style)) { w.setStyle(style); } } }, onload: function(a, b) { // Border color let container = document.createElement('div'); let div = document.createElement('div'); container.appendChild(div); let colorPicker = jSuites.color(div, { closeOnChange: false, onchange: function(o, v) { o.parentNode.children[1].style.color = v; b.color = v; }, }); let i = document.createElement('i'); i.classList.add('material-icons'); i.innerHTML = 'color_lens'; i.onclick = function() { colorPicker.open(); } container.appendChild(i); a.children[1].appendChild(container); div = document.createElement('div'); jSuites.picker(div, { type: 'select', data: [ 1, 2, 3, 4, 5 ], render: function(e) { return '<div style="height: ' + e + 'px; width: 30px; background-color: black;"></div>'; }, onchange: function(a, k, c, d) { b.thickness = d; }, width: '50px', }); a.children[1].appendChild(div); const borderStylePicker = document.createElement('div'); jSuites.picker(borderStylePicker, { type: 'select', data: ['solid', 'dotted', 'dashed', 'double'], render: function(e) { if (e === 'double') { return '<div style="width: 30px; border-top: 3px ' + e + ' black;"></div>'; } return '<div style="width: 30px; border-top: 2px ' + e + ' black;"></div>'; }, onchange: function(a, k, c, d) { b.style = d; }, width: '50px', }); a.children[1].appendChild(borderStylePicker); div = document.createElement('div'); div.style.flex = '1' a.children[1].appendChild(div); } }); items.push({ type:'divisor', }); items.push({ content: 'add_photo_alternate', onclick: function(a,b,c) { let w = getActive(); if (w) { c.children[1].component.open(); } }, tooltip: 'Add image', render: function(a) { const open = function(e) { e.style.display = 'block'; e.focus(); } const close = function(e) { e.style.display = ''; e.textContent = ''; } // Border color let o = createDialog(open, close); o.classList.add('jss_upload'); a.appendChild(o); // Create image uploader jSuites.image(o, { onchange: function(a) { let w = getActive(); if (w) { let top = 0; let left = 0; let cursor = w.cursor; if (cursor) { top = cursor.offsetTop - w.thead.offsetHeight; left = cursor.offsetLeft - 50; } w.setMedia({ src: a.content[0].content, width: 400, height: 300, top: top, left: left, }); } o.component.close(); } }); } }); items.push({ content: 'fullscreen', onclick: function(a,b,c) { let w = getActive(); if (c.children[0].textContent === 'fullscreen') { w.parent.fullscreen(true); c.children[0].textContent = 'fullscreen_exit'; } else { w.parent.fullscreen(false); c.children[0].textContent = 'fullscreen'; } }, tooltip: 'Toggle Fullscreen', updateState: function(a,b,c,d) { if (d.parent.config.fullscreen === true) { c.children[0].textContent = 'fullscreen_exit'; } else { c.children[0].textContent = 'fullscreen'; } } }); items.push({ content: 'search', onclick: function(a,b,c) { let w = getActive(); if (typeof(w.parent.tools.search) !== 'undefined') { w.parent.tools.search.open(true); } else { if (c.children[0].textContent === 'search') { w.showSearch(); c.children[0].textContent = 'search_off'; } else { w.hideSearch(); c.children[0].textContent = 'search'; } } }, tooltip: 'Toggle Search', updateState: function(a,b,c,d) { if (d.options.search === true) { c.children[0].textContent = 'search_off'; } else { c.children[0].textContent = 'search'; } } }); return items; }