Custom editor
The following example shows how to integrate a third-party plugin as a custom column.Example
A basic integration with a third party component.
A custom column based on the clockpicker plugin by weareoutman.
JavaScript example
<html> <script src="https://jspreadsheet.com/v10/jspreadsheet.js"></script> <script src="https://jsuites.net/v5/jsuites.js"></script> <link rel="stylesheet" href="https://jspreadsheet.com/v10/jspreadsheet.css" type="text/css" /> <link rel="stylesheet" href="https://jsuites.net/v5/jsuites.css" type="text/css" /> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" /> <link rel="stylesheet" type="text/css" href="http://weareoutman.github.io/clockpicker/dist/jquery-clockpicker.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="http://weareoutman.github.io/clockpicker/dist/jquery-clockpicker.min.js"></script> <div id="custom"></div> <script> var clockEditor = function() { // Create the editor once to persist the whole lifecycle of the spreadsheet var editor = document.createElement('input'); editor.classList.add('jss_object'); editor.type = 'text'; editor.style.width = '100%'; // Close event var closeEvent = null; // Create instance of the clock picker $(editor).clockpicker({ afterDone: function() { closeEvent(); }}); // JSS editor var methods = {}; methods.createCell = function(cell, value, x, y, instance, options) { cell.innerHTML = value; } methods.updateCell = function(cell, value, x, y, instance, options) { if (cell) { cell.innerHTML = value; } } methods.openEditor = function(cell, value, x, y, instance, options) { // Append the clock picker to the input container instance.parent.input.appendChild(editor); // Make sure input container is not editable instance.parent.input.setAttribute('contentEditable', false); // Set the current value editor.value = value; // Focus to open the clock picker editor.focus(); // Make sure JSS object class is set to keep the focus on the spreadsheet if (! document.querySelector('.clockpicker-popover').classList.contains('jss_object')) { document.querySelector('.clockpicker-popover').classList.add('jss_object'); } // Update close event closeEvent = function() { instance.closeEditor(cell, true); } } methods.closeEditor = function(cell, save, x, y, instance, options) { if (save) { cell.innerHTML = editor.value; } else { cell.innerHTML = ''; } // Return value return cell.innerHTML; } return methods; }(); // Set your JSS license key (The following key only works for one day) jspreadsheet.setLicense('MTAzNzA5MzA4MzhlNWQ4OTFkZGVhZjk4ZjRlZWZlYWYxNTY3YmU2ZWZhZjhkZjMyZTZkMzc4ZTc3MGI0YzRiNDY2NWZlM2IzZDgwNDBhZjA2OTE0NmMxODY0ZWJiYmFkOTU2NGQzNzU4NmRkZDg2OWZiYzFlYzMxNGI4MzQ5NTgsZXlKdVlXMWxJam9pU25Od2NtVmhaSE5vWldWMElpd2laR0YwWlNJNk1UWTVOakkwTURRNE1Dd2laRzl0WVdsdUlqcGJJbXB6Y0hKbFlXUnphR1ZsZEM1amIyMGlMQ0pqYjJSbGMyRnVaR0p2ZUM1cGJ5SXNJbXB6YUdWc2JDNXVaWFFpTENKamMySXVZWEJ3SWl3aWQyVmlJaXdpYkc5allXeG9iM04wSWwwc0luQnNZVzRpT2lJek5DSXNJbk5qYjNCbElqcGJJblkzSWl3aWRqZ2lMQ0oyT1NJc0luWXhNQ0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owSWl3aVltRnlJaXdpZG1Gc2FXUmhkR2x2Ym5NaUxDSnpaV0Z5WTJnaUxDSndjbWx1ZENJc0luTm9aV1YwY3lKZExDSmtaVzF2SWpwMGNuVmxmUT09'); // Create the spreadsheet jspreadsheet(document.getElementById('custom'), { worksheets: [{ data: [ ['PHP', '14:00'], ['Javascript', '16:30'], ], columns: [ { type: 'text', title: 'Course Title', width: '300px' }, { type: clockEditor, title: 'Time', width: '200px' }, ] }] }); </script> </html>
The following example shows a integration between React Mui and JSS React Spreadsheet.
See this example on codesandbox
See this example on codesandbox
React example
import React, { useRef } from "react"; import { createRoot } from "react-dom"; import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react"; import Switch from "@mui/material/Switch"; const license = 'MTAzNzA5MzA4MzhlNWQ4OTFkZGVhZjk4ZjRlZWZlYWYxNTY3YmU2ZWZhZjhkZjMyZTZkMzc4ZTc3MGI0YzRiNDY2NWZlM2IzZDgwNDBhZjA2OTE0NmMxODY0ZWJiYmFkOTU2NGQzNzU4NmRkZDg2OWZiYzFlYzMxNGI4MzQ5NTgsZXlKdVlXMWxJam9pU25Od2NtVmhaSE5vWldWMElpd2laR0YwWlNJNk1UWTVOakkwTURRNE1Dd2laRzl0WVdsdUlqcGJJbXB6Y0hKbFlXUnphR1ZsZEM1amIyMGlMQ0pqYjJSbGMyRnVaR0p2ZUM1cGJ5SXNJbXB6YUdWc2JDNXVaWFFpTENKamMySXVZWEJ3SWl3aWQyVmlJaXdpYkc5allXeG9iM04wSWwwc0luQnNZVzRpT2lJek5DSXNJbk5qYjNCbElqcGJJblkzSWl3aWRqZ2lMQ0oyT1NJc0luWXhNQ0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owSWl3aVltRnlJaXdpZG1Gc2FXUmhkR2x2Ym5NaUxDSnpaV0Z5WTJnaUxDSndjbWx1ZENJc0luTm9aV1YwY3lKZExDSmtaVzF2SWpwMGNuVmxmUT09'; const Editor = { createCell: (cell, value, x, y, instance, options) => { // Clone the column definitions let o = { ...options, defaultChecked: !!value }; // type is a reserved property delete o.type; // Change handler const onChange = function (event, newValue) { // Update the JSS data based on the component instance.setValue(cell, newValue); }; // Create the link between react component and JSS createRoot(cell).render(<Switch {...o} onChange={onChange} />); }, updateCell: (cell, value) => { // Get the checkbox let input = cell.querySelector("input"); // Toggle the value input.checked = !!value; }, openEditor: (cell, value, x, y, instance) => { // Toggle the value instance.setValue(cell, !value); // Do not open editor since is just a checkbox return false; }, closeEditor: () => { // This is not used return false; } }; export default function App() { // Spreadsheet array of worksheets const spreadsheet = useRef(); // Data const data = [[true]]; // Columns const columns = [ { type: Editor, color: "warning" } ]; // Render component return ( <Spreadsheet ref={spreadsheet} license={license}> <Worksheet data={data} columns={columns} /> </Spreadsheet> ); }
Example available in JavaScript and React only.
Example available in JavaScript and React only.